我有一个客户端证书存储在我的密钥库中,同时服务器的公共证书存储在我的信任库中。
目前,我正在设置我的密钥库和信任库:
目前,我正在设置我的密钥库和信任库:
System.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
System.setProperty("javax.net.ssl.keyStore", Constants.APPLICATION_HOME + File.separatorChar + this.certificateName);
System.setProperty("javax.net.ssl.keyStorePassword", certificatePass);
System.setProperty("javax.net.ssl.trustStore", Constants.APPLICATION_HOME + File.separatorChar + "jssecacerts");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
System.setProperty("javax.net.ssl.trustStoreType", "JKS");
不过我希望在不使用System.setProperty()
的情况下完成。至少对于密钥库部分,信任库可以保持不变。我尝试了以下代码:
keyStore = KeyStore.getInstance("PKCS12");
InputStream keyStoreData = new FileInputStream(Constants.APPLICATION_HOME + File.separatorChar + this.certificateName);
this.keyStore.load(keyStoreData, certificatePass.toCharArray());
TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustFactory.init(this.keyStore);
TrustManager[] trustManagers = trustFactory.getTrustManagers();
sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustManagers, null);
SSLContext.setDefault(sslContext);
但是,就我所看到的,那是将信任库设置为客户端证书,因此我的握手失败了,因为现在我的信任库中只有客户端证书,没有来自我的jssecacerts文件的服务器证书。它会显示以下错误:
http-bio-8080-exec-10,处理异常: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:PKIX路径构建失败: sun.security.provider.certpath.SunCertPathBuilderException:无法 找到请求目标的有效认证路径
我该如何实现这个?