我正在尝试连接到需要SSL
证书的PKCS12
网络服务。
问题:是否可以不将证书安装到本地密钥库,而是在运行时动态加载?
我尝试如下:
static {
KeyStore.getInstance("PKCS12").load(this.getClass().getClassLoader()
.getResourceAsStream("myfile.p12"), "password".toCharArray());
}
但结果是:
sun.security.validator.ValidatorException:PKIX路径构建失败。 sun.security.provider.certpath.SunCertPathBuilderException:无法 找到所请求目标的有效证书路径。
显然它不起作用。但为什么呢?
旁注:链接的SO问题没有回答我的问题,因为它定位trustStore
,但我的问题是关于keystore
。
答案 0 :(得分:1)
此问题与此代码无关。您的信任库不信任服务器的证书。如果它是自签名的,您将必须导入它。更好的是,让它由CA签名。
答案 1 :(得分:-1)
问题在于虽然您的密钥库已经创建并加载了您的客户端证书(假设一切都很好),但SSLContext未配置为使用它。
尝试:
Keystore keystore = KeyStore.getInstance("PKCS12").load(this.getClass().getClassLoader()
.getResourceAsStream("myfile.p12"), "password".toCharArray());
SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore,"password".toCharArray()).build();
SSLContext.setDefault(sslcontext);