如何在.NET中从X509Certificate2中提取AuthorityKeyIdentifier

5

我正在寻找一种从X509Certificate2实例中提取AuthorityKeyIdentifier扩展的方法。 我没有看到任何内置支持,但由于Windows可以正确构建证书链,我知道该功能必须存在于某个级别上。 如果答案是要使用DER解析器,则是否有一个好的实现可以参考?

3个回答

13

遍历 X509Certificate2.Extensions 属性中的扩展,并查找具有 OID 2.5.29.35(根据 http://www.alvestrand.no/objectid/2.5.29.35.html)的扩展。 这就是 AuthorityKeyIdentifier 扩展。

[编辑:添加以下内容。]

Extensions 属性的每个成员都是 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));

对于微软中间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。


有趣的是,Microsoft告诉我OID是2.5.29.1,但rfc5280认为最后一段是35。无论如何,结果是一个八位字符串,我想提取出编码值。 - Tedford
扩展了答案以展示如何提取可读的扩展名,并且通过一些努力,可以进行机器解析。 - akton
这个字符串总是用英语吗,即使在其他语言环境下也是如此吗?我很惊讶微软没有给我们除了字符串以外的输出类型。 - Chris Benard
@ChrisBenard 很好的问题。我不知道。抱歉。 - akton


-1

有一个更简单的选择 - 使用一些现有的组件来提供更灵活的证书处理。您可以使用BouncyCastle或我们的SecureBlackbox


同意;然而,由于约束条件,我无法包含任何开源软件。因此需要内置支持或公司内部开发的解决方案。 - Tedford
@Tedford,我们的商业产品怎么办? :) 说真的,DER解析器也是第三方的,由于其低级别的性质,嵌入和处理比高级证书管理类更困难。 - Eugene Mayevski 'Callback
很遗憾,我们不能在发布周期的那个时间点进行额外的资本支出...也许在未来的版本中可以考虑。 - Tedford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接