6

我正在使用Java中的X509证书。 鉴于证书是否可以在签名层次结构中找到所有其他证书,直到到达根证书?获取证书链

我有一个证书文件(扩展名为.cer),我想提取父签名证书。我想继续查找该证书的父项,直到获得最终的根证书,该证书是自签名的。

我检查了java.security.cert中的X509Certificate证书API和相关API,但找不到任何有用的东西。

+1

可能的[如何从现有的叶证书生成中间和根证书?]的副本(http://stackoverflow.com/questions/11076491/how-to-generate-intermediate-and-root-cert-from-现有叶证书) –

+1

没有可靠的方法来做到这一点。在http://stackoverflow.com/a/11076955/47961看到我的答案 –

+1

你试过了吗[java.security.KeyStore#getCertificateChain()](http://docs.oracle.com/javase/6/docs/api /java/security/KeyStore.html#getCertificateChain(java.lang.String))? – Zaki

回答

2

这并不难 - 假设你以某种方式/带外获得了所有中间证书和一个或多个keychains中的根证书。

看一看

http://codeautomate.org/blog/2012/02/certificate-validation-using-java/ 

用于剪断这不只是一个代码。关键位是validateKeyChain(),基本上由

cert = cert-to-validate 
    while(not self signed) { 
     extract issuer from cert 
     scan keychain(s) to find cert with a subject equal to the issuer 
     if none found - error 
     check if the signature is correct. 
     cert = issuers_cert 
    } 
    if not at the top/root - error 

至于如何你得到中间体/根证书 - 这是一个不同的问题。请注意,这段代码有点幼稚 - 并且不太了解交叉签名。尽管如此,java pkix调用 - BouncyCastle有一个例子。

您通常可以将根证书构建到密钥链中;但是中间证书通常需要被“收集”或更加动态地发现。这通常需要在TLS或类似期间查询SSL堆栈。