我试图使用Bouny城堡生成一个证书,但是我发现我似乎无法获得颁发证书的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
然而,我在证书中找不到任何似乎与此相匹配的信息。有什么想法吗?
发布于 2014-04-07 13:45:38
查看RFC 5280中授权密钥标识符的规范
keyIdentifier字段的值应来自用于验证证书签名的公钥或生成唯一值的方法。第4.2.1.2节描述了从公钥生成密钥标识符的两种常用方法。如果以前还没有建立密钥标识符,本规范建议使用这些方法中的一种来生成keyIdentifiers,或者使用使用不同哈希算法的类似方法。如果密钥标识符已事先建立,CA应使用先前建立的标识符。 ..。 KeyIdentifier ::=八进制字符串
因此,密钥标识符的值只是一些八进制字符串,一些字节数组,没有任何明显的包含证书信息。如果您查看所引用的常用方法
从公钥生成密钥标识符的两种常见方法是: (1) keyIdentifier由位字符串subjectPublicKey值的160位SHA-1散列(不包括标记、长度和未使用位数)组成。 (2) keyIdentifier由一个值为0100的四位类型字段组成,后面是位字符串subjectPublicKey值的SHA-1哈希值中最不重要的60位(不包括标记、长度和未使用比特数)。
在这里,密钥标识符实质上是一些散列值。
因此,授权密钥标识符的密钥标识组件不会立即提供某些证书的明确信息。授权密钥标识符可能有附加的字段,但它们是可选的。因此,实质上:
在符合CA证书的情况下,主题密钥标识符的值必须是放置在由本证书主体颁发的证书的权威密钥标识符扩展(4.2.1.1节)的密钥标识符字段中的值。
因此,通过将这些值作为抽象字节数组进行比较,可以找到匹配的颁发者/颁发证书对,而不隐含任何其他信息。
https://stackoverflow.com/questions/22888574
复制相似问题