如何验证数字证书的有效性 信息安全
发布网友
发布时间:2022-04-20 12:38
我来回答
共1个回答
热心网友
时间:2022-05-18 08:53
一、有效期
证书的有效期验证这个比较简单,就是使用时间在必须在证书起始和结束日期之间才有效,通过解析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在线证书状态协议,可以即时的查询证书状态。