想象一下,我有私人密钥和公共证书的p12容器。当我使用Java keytool将p12公共证书导出到单独的.cer文件时,我可以单击.cer文件并查看完整的证书链。我怎样才能以编程方式获得完整路径?
我很少调查。我使用了keytool的print cert -v
命令,并看到属性为AuthorityInfoAccess
的子属性
accessMethod: caIssuers
accessLocation: URIName: http://.../some.crt
我下载了some.crt(它是PEM证书),并再次使用print cert -v
并再次看到
accessLocation: URIName: http://.../some2.crt
并重复下载.crt文件和geting parent,直到达到没有此类属性的root .crt。
我认为,我应按照上述方式以编程方式下载链,并将其提供给CertPathValidator
,如图所示here。
如果我真的需要像上面描述的那样获得链,是否有任何图书馆已经这样做了?有没有办法用std lib 做到这一点?我没有找到bouncycastle示例和java的标准库代码,如
java.security.cert.Certificate[] cchain = keystore.getCertificateChain(alias);
返回一个实际拥有2" parent"的证书条目。
答案 0 :(得分:1)
Nitpick:你肯定是keytool -printcert
(带连字符,没有空格,这里不需要-v
)。
Java在JKS或PKCS12中创建的私钥条目通常包含完整链,但keytool -exportcert
仅提取 叶证书。
由其他东西创建的PKCS12可能包含或不包含完整链,可能取决于您在创建时单击的内容。
如果链接在那里,KeyStore.getCertificateChain
会返回它,而keytool -list -v
(此处-v
很重要)会显示它。
如果证书是作为trustedcert条目导入或重新导入的 - 通常在JKS中,PKCS12不是为单独的证书设计的 - 它从不包含链,因此getCertificateChain
在该条目上不起作用,但IIRC CertPathBuilder
可以在一个商店中构建一个组合多个trustedcert条目的链。
如果您确实需要父(连锁)证书 你还没有,并且孩子指定了AIA.caIssuers,然后使用它来获取是明智的。 我很确定标准Java(JRE)库中没有任何东西可以为你做这件事,至少到目前为止;我不知道BouncyCastle或其他任何人。