首页logo
  •  

jonllen

金龙,目前就职于一家软件公司,从事Java和.Net信息安全开发设计。

个人档案

jonllen
心情闪存 | 给他留言
妮称:jonllen
来自:中国. 湖南. 湘潭
简述:金龙,目前就职于一家软件公司,从事Java和.Net信息安全开发设计。
博客日历

数字证书的有效性验证

分类:工作

最近在做数字证书有效性验证的接口,主要是从数字证书的有效期、颁发根证书和CRL进行验证,下面我就从这几个方面来说数字证书的有效性验证。

一、有效期

证书的有效期验证这个比较简单,就是使用时间在必须在证书起始和结束日期之间才有效,通过解析X.509对象很容易获取起止时间,判断证书有效期代码如下:

        /// <summary>
/// 有效期验证
/// </summary>
/// <param name="cert"></param>
/// <returns></returns>
public static bool CheckDate(string cert)
{
byte[] bt = Convert.FromBase64String(cert);
System.Security.Cryptography.X509Certificates.X509Certificate2 x509
= new System.Security.Cryptography.X509Certificates.X509Certificate2(bt);


string date = x509.GetExpirationDateString();
DateTime dtex
= Convert.ToDateTime(date);
DateTime dtnow
= DateTime.Now;
DateTime dteff
= Convert.ToDateTime(x509.GetEffectiveDateString());

if (dteff < dtnow && dtnow < dtex)
{
return true;
}

return false;
}

二、颁发根证书

每个数字证书都有颁发根证书的签名,验证证书就是用根证书公钥来验证证书颁发者签名。首先,必须要找到数字证书的颁发根证书,Windows本身集成一些权威的受信任的根证书颁发机构,如VeriSign等,如果不在受信任的证书列表,我们打开证书会显示“Windows 没有足够信息,不能验证该证书”,当然我们可以把根证书加到受信任的根证书列表,这样证书就可以显示正常。

一般带证书链的数字证书中会包含证书颁发机构颁发者,逐级验证到最顶级根证书,每一级都用上级颁发根证书验证证书签名,直到证书颁发者和使用者一样自己可以验证自己通过。根证书的基本约束会不一样,Subject Type=CA代表可以签发证书,而一般的用户证书为Subject Type=End Entity,为终端实体不能再签发证书。

三、CRL验证

CRL是经CA签名的证书作废列表,用于做证书冻结和撤销时对证书有效性状态控制。一般数字证书中都有 CRL分发点地址,提供了HTTP和LDAP方式访问。通过BouncyCastle库解析X509证书的扩展项我们可以获取到CRL地址,然后使用相应方式下载CRL进行验证。

获取数字证书CRL

在用LDAP方式下载CRL时,注意LDAP协议名称要大写,不然访问会出错。下载的CRL格式可能是BASE64编码的,需要判断转换成DER编码二进制格式。

CRL分全量CRL和增量CRL,另外还有分段CRL,即同个CA的证书分不同的CRL地址段,主要是为了分流服务器负载。CRL有生效日期和下次更新时间,一般是定时更新,所以CRL并不是即时状态的。因此还有OCSP在线证书状态协议,可以即时的查询证书状态。

最后,总结证书有效性验证流程设计,如下图。

标签:工作
  • posted@ 2013-11-27 20:58
  • update@ 2013-11-27 23:13:45
  • 阅读(5124)
  • 评论(0)

相关文章

评论
暂无任何评论。
发表评论
*必填
回复通知我
*必填