用于以编程方式将证书添加到 Java 密钥库的选项
我收到SSL握手异常错误:PKIX“路径不链接”(此处描述)。我通过使用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吗?我觉得我要么错误地将证书添加到密钥库,要么我没有以正确的方式将密钥库安装到TrustManager中。
仅供参考:我也试图通过实施X509TrustManager来解决这个问题。