【发布时间】:2012-08-22 07:05:36
【问题描述】:
我正在寻找一种从 X509Certificate2 实例中提取 AuthorityKeyIdentifier 扩展的方法。我没有看到对此的任何内置支持,但由于 Windows 可以正确构建证书链,我知道该功能必须存在于某个级别。如果答案是滚动 DER 解析器,是否有可以参考的良好实现?
【问题讨论】:
标签: c# x509 x509certificate2
我正在寻找一种从 X509Certificate2 实例中提取 AuthorityKeyIdentifier 扩展的方法。我没有看到对此的任何内置支持,但由于 Windows 可以正确构建证书链,我知道该功能必须存在于某个级别。如果答案是滚动 DER 解析器,是否有可以参考的良好实现?
【问题讨论】:
标签: c# x509 x509certificate2
遍历 X509Certificate2.Extensions 属性中的扩展并查找 OID 为 2.5.29.35 的扩展(根据 http://www.alvestrand.no/objectid/2.5.29.35.html)。那就是 AuthorityKeyIdentifier 扩展。
[编辑:添加以下内容。]
扩展属性的每个成员都是一个 ASN 编码。因此,您可以执行以下操作以使其成为人类可读或机器可解析的格式:
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
...
X509Extension extension; // The OID 2.5.29.35 extension
AsnEncodedData asndata = new AsnEncodedData(extension.Oid, extension.RawData);
Console.WriteLine(asndata.Format(true));
对于 Microsoft 中间 CA 证书之一,Format() 方法返回以下内容:
[1]Authority Info Access
Access Method=Certification Authority Issuer (1.3.6.1.5.5.7.48.2)
Alternative Name:
URL=http://www.microsoft.com/pki/certs/MicrosoftRootCert.crt
解析当然不容易,但是你可以找一行以正则表达式\[\d+\]Authority Info Access开头,然后在它下面找到一行正则表达式URL=(.+)(八个空格在格式中不清楚)并使用括号组中的 URL。
有一个更简单的选项可用 - 采用一些现有组件,在处理证书时提供更大的灵活性。您可以使用BouncyCastle 或我们的SecureBlackbox。
【讨论】: