【问题标题】:How to get AuthorityKeyIdentifier from Certificate如何从证书中获取 AuthorityKeyIdentifier
【发布时间】:2014-04-06 00:26:49
【问题描述】:

我正在尝试使用 Bouncy Castle 生成证书,但我发现我似乎无法获得颁发证书的 AuthorityKeyIdentifier。我一直在尝试确定到底是什么问题,但到目前为止我不知道。

我正在检查的商店中的证书的授权密钥标识符为

KeyID=64 c1 59 db eb e7 2b f0 d7 e5 e3 81 77 d2 be b0
Certificate Issuer:
     CN=Test Certification Authority
Certificate SerialNumber=5c 27 00 3b 0f 0a a2 83 4a 8d 2b d5 45 d2 9c 3f

然而,每当我在充气城堡中使用以下代码获取密钥时,它都会给我一个完全不同的 AKI:

var password = "p@ssw0rd1";
var file = File.ReadAllBytes(@"C:\somefilepath\TESTCA.pfx");

Pkcs12Store st = new Pkcs12Store(new MemoryStream(file), password.ToCharArray());
var alias = st.Aliases.Cast<string>().Where (s => st.IsKeyEntry(s)).Single();
var cert = (X509Certificate)st.GetCertificate(alias).Certificate;

var subjectPKI = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo( cert.GetPublicKey());
var aki = new AuthorityKeyIdentifier(subjectPKI);
BitConverter.ToString(aki.GetKeyIdentifier()).Replace("-"," ").Dump();

使用这个,我最终得到一个授权密钥标识符:

68 22 23 ED 45 82 A6 0E D6 A4 87 74 F2 E0 22 C4 4B F7 7D DF

但我在证书中找不到任何似乎与之匹配的信息。有什么想法吗?

【问题讨论】:

    标签: c# security x509certificate bouncycastle x509


    【解决方案1】:

    查看 [RFC 5280][1] 中的授权密钥标识符规范:

    keyIdentifier 字段的值应该从 用于验证证书签名或方法的公钥 产生独特的价值。生成密钥的两种常用方法 来自公钥的标识符在第 4.2.1.2 节中描述。 如果以前没有建立密钥标识符,则此 规范建议使用这些方法之一来生成 keyIdentifiers 或使用使用不同哈希的类似方法 算法。在先前已建立密钥标识符的情况下, CA 应该使用之前建立的标识符。

    ...

    KeyIdentifier ::= OCTET STRING
    

    因此,密钥标识符的值只是一些八位字节字符串,一些字节数组,没有任何明显的证书信息包含。如果你看一下常用的方法提到

    两种常见的 从公钥生成密钥标识符的方法有:

    (1) keyIdentifier 由 160 位的 SHA-1 散列组成 BIT STRING subjectPublicKey 的值(不包括标签, 长度和未使用的位数)。

    (2) keyIdentifier 由一个四位类型字段组成 值 0100 后跟 60 位的最低有效位 BIT STRING 值的 SHA-1 哈希 subjectPublicKey(不包括标签、长度和数量) 未使用的位)。

    这里的关键标识符本质上是一些哈希值

    因此,授权密钥标识符的密钥标识符组件不会立即给出某些证书的明确信息。授权密钥标识符可能具有包含此类信息的附加字段,但它们是可选的。因此,本质上是:

    在符合 CA 证书中, 主题密钥标识符必须是放置在密钥标识符中的值 的权限密钥标识符扩展(第 4.2.1.1 节)的字段 此证书的主体颁发的证书。

    因此,您可以通过将这些值作为抽象字节数组进行比较来找到匹配的颁发者/颁发的证书对,而无需暗示其他信息。

    【讨论】:

    • 哇,感谢您提供了一个很棒的详细答案!我自己终于在没有看到 RFC 的情况下得出了这个结论。从某种意义上说,这似乎是任意的。我这样做的主要目的是因为我试图编写一个流畅的界面来创建证书。我终于通过蛮力和纯粹的运气弄清楚了我需要做些什么来制作父母颁发的证书。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多