我遇到了SSL握手异常错误:PKIX “path does not chain”(在此处描述)。 通过使用openssl导入证书链,我解决了这个问题:
openssl s_client -host www.envmgr.com -port 443 -showcerts > cert_chain.crt
然后将其安装到我的JDK密钥库中:
keytool -import -alias envmgrchain -file cert_chain.crt -keystore cacerts -storepass changeit
这个可以运行。太好了。问题是我们将把应用程序放在像rackspace或AWS这样的云服务器上,我认为有很大的可能性我们无法访问修改JVM的密钥库以添加此链。
我想,“没问题,我会通过编程方式将证书链添加到密钥库中”,所以我从我的JVM中删除了它:
keytool -delete -alias envmgrchain -keystore cacerts -storepass changeit
然后添加了这段代码:
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
//Create an empty keystore that we can load certificate into
trustStore.load(null);
InputStream fis = new FileInputStream("cert_chain.crt");
BufferedInputStream bis = new BufferedInputStream(fis);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
while(bis.available()>0) {
Collection<? extends Certificate> certs = cf.generateCertificates(bis);
Iterator<? extends Certificate> iter = certs.iterator();
//Add each cert in the chain one at a time
for(int i=0; i<certs.size(); i++) {
Certificate cert = iter.next();
String alias = "chaincert"+((i>0)?i:"");
trustStore.setCertificateEntry(alias, cert);
}
}
bis.close();
fis.close();
//Add custom keystore to TrustManager
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(trustStore);
SSLContext ctx = SSLContext.getInstance("TLSv1");
ctx.init(null, tmf.getTrustManagers(), null);
但当我运行它时,PKIX错误再次出现。以上代码不等同于keytool -import吗?我觉得我可能要么是错误地将证书添加到Keystore中,要么没有以正确的方式将Keystore安装到TrustManager中。
FYI:我还试图通过实现X509TrustManager来解决此问题。