【问题标题】:How to extract the AuthorityKeyIdentifier from a X509Certificate2 in .NET如何从 .NET 中的 X509Certificate2 中提取 AuthorityKeyIdentifier
【发布时间】:2012-08-22 07:05:36
【问题描述】:

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

【问题讨论】:

    标签: c# x509 x509certificate2


    【解决方案1】:

    遍历 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。

    【讨论】:

    • 有趣的是 Microsoft 告诉我 OID 是 2.5.29.1,但 rfc5280 同意最后一段是 35。无论如何,结果是一个八位字节字符串,我想提取出来编码值。
    • 扩展了答案以展示如何将扩展提取为人类可读的内容,并且通过一些努力,机器可解析。
    • 该字符串是否始终为英文,即使在其他语言环境中也是如此?我很惊讶微软没有为我们提供除字符串以外的输出的类型化版本。
    • @ChrisBenard 好问题。我不知道。对不起。
    【解决方案2】:

    有一个更简单的选项可用 - 采用一些现有组件,在处理证书时提供更大的灵活性。您可以使用BouncyCastle 或我们的SecureBlackbox

    【讨论】:

    • 同意;但是,由于限制,我不能包含任何开源软件。因此需要内置支持或内部开发的解决方案。
    • @Tedford 商业(我们的)怎么样? :) 说真的,DER 解析器也是第三方的,而且它(由于低级性质)比高级证书管理类更难嵌入和处理。
    • 很遗憾,我们不能在发布周期的那个时候进行额外的资本支出......也许在未来的版本中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 2021-11-25
    • 2023-02-10
    • 2011-01-19
    • 2014-04-23
    • 1970-01-01
    相关资源
    最近更新 更多