tos*_*ory 4 c# security bouncycastle x509certificate x509
我正在尝试使用 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
Run Code Online (Sandbox Code Playgroud)
然而,每当我在充气城堡中使用以下代码来获取密钥时,它都会给我一个完全不同的 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();
Run Code Online (Sandbox Code Playgroud)
使用这个,我最终得到一个权限密钥标识符:
68 22 23 ED 45 82 A6 0E D6 A4 87 74 F2 E0 22 C4 4B F7 7D DF
Run Code Online (Sandbox Code Playgroud)
但我在证书中找不到任何与之匹配的信息。有任何想法吗?
看一下[RFC 5280][1]中权威密钥标识符的规范:
keyIdentifier 字段的值应该源自用于验证证书签名的公钥或生成唯一值的方法。第 4.2.1.2 节描述了从公钥生成密钥标识符的两种常用方法。如果先前尚未建立密钥标识符,则本规范建议使用这些方法之一来生成密钥标识符或使用使用不同散列算法的类似方法。如果先前已经建立了密钥标识符,则 CA 应使用先前建立的标识符。
...
Run Code Online (Sandbox Code Playgroud)KeyIdentifier ::= OCTET STRING
因此,密钥标识符的值只是一些八位字节字符串、一些字节数组,没有任何明显的包含证书信息。如果你看看提到的常见方法
从公钥生成密钥标识符的两种常见方法是:
(1) keyIdentifier 由 BIT STRING subjectPublicKey 值的 160 位 SHA-1 哈希值组成(不包括标签、长度和未使用位数)。
(2) keyIdentifier 由一个四位类型字段组成,值为 0100,后跟 BIT STRING subjectPublicKey 值的 SHA-1 散列的最低有效 60 位(不包括标签、长度和未使用的数量)位)。
这里的键标识符本质上是一些哈希值
因此,权威密钥标识符的密钥标识符组件并不能立即给出某些证书的明确信息。授权密钥标识符可能具有包含此类信息的附加字段,但它们是可选的。因此,从本质上来说:
在一致的 CA 证书中,主体密钥标识符的值必须是放置在该证书主体颁发的证书的授权密钥标识符扩展(第 4.2.1.1 节)的密钥标识符字段中的值。
因此,您可以通过将这些值作为抽象字节数组进行比较来找到匹配的颁发者/颁发的证书对,而无需隐含任何其他信息。