如何从证书中获取 AuthorityKeyIdentifier

本文关键字:获取 AuthorityKeyIdentifier 证书 | 更新日期: 2023-09-27 17:56:59

我正在尝试使用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

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

如何从证书中获取 AuthorityKeyIdentifier

查看 [RFC 5280][1] 中颁发机构密钥标识符的规范:

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

KeyIdentifier ::= OCTET STRING

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

两个常见的 从公钥生成密钥标识符的方法包括:

(1) 密钥标识符由 160 位 SHA-1 哈希 位字符串主题公钥的值(不包括标记, 长度和未使用的位数)。

(2) 密钥标识符由一个四位类型字段组成,其中 值 0100 后跟最低有效 60 位 位字符串值的 SHA-1 哈希 主题公钥(不包括标签、长度和数量 未使用的位)。

这里的密钥标识符本质上是一些哈希值

因此,颁发机构密钥标识符的密钥标识符组件不会立即提供某些证书的明确信息。颁发机构密钥标识符可能具有包含此类信息的其他字段,但它们是可选的。因此,从本质上讲:

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

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