编程方式读取X.509证书吊销列表(CRL)(一)应用Bouncy Castle Crypto
X.509 结构的证书被吊销后,序列号会出现在Certificate Revocation List (CRL) 中,我们可以将它另存为一个.crl的文件,就能够查看被吊销的证书信息,但.NET Framework并没有提供可对Crl进行属性访问的类(Java中提供了X509Crl),要实现这样的功能,我们得借助.NET框架之外的技术:Bouncy Castle Crypto或者Mono SDK。
先介绍如何使用Bouncy Castle Crypto(Version 1.4)读取X.509证书及吊销列表。
Bouncy Castle Crypto是一个开源的加/解密框架,下载地址:
http://www.bouncycastle.org/csharp/download/bccrypto-net-1.4-bin.zip
首先加入X.509证书所在的命名空间:
其中的几个有关的类:
X509CrlParser 用于构建一个crl对象,支持从字节数组和内存流中获取数据。
X509Crl crl对象,包含证书吊销组织、吊销证书列表、时间戳等信息。
X509CrlEntry crl对象中被吊销的证书对象。
ISet 在Org.BouncyCastle.Utilities.Collections下,X509Crl中被读取所有证书对象放在HashSet中,以ISet接口类型返回,HashSet支持迭代器。
下面是读取Crl的示例:
List<int> numbers = new List<int>();
X509CrlParser parser = new X509CrlParser();
X509Crl crl = parser.ReadCrl((byte[])obj);
//获取所有的吊销证书
ISet crlSet = crl.GetRevokedCertificates();
if (crlSet != null && crlSet.Count > 0)
{
foreach (object o in crlSet)
{
X509CrlEntry crlEntry = (X509CrlEntry)o;
int serialNumber = crlEntry.SerialNumber.IntValue;
if (!numbers.Contains(serialNumber))
{
numbers.Add(serialNumber);
}
}
}
X509CrlEntry.SerialNumber.IntValue将16进制的证书序列号以10进制的Int32类型输出。
另外再提一下BC Crypto的X509Certificate类和.NET Framework下的X509Certificate2类的区别:
X509Certificate2输出证书DN信息时,属性SubjectName是将个人信息按照从小到大(姓名-组织-市-省-国家)排列,而BC Crypto的X509Certificate使用SubjectDN属性,将个人信息从大到小排列,市的标识是ST,.NET是S。如果需要根据证书生成组织结构,这个需要特别注意。