Java 如何在不安装密钥库的情况下连接到SSL证书Web服务?
我正在尝试连接到需要Java 如何在不安装密钥库的情况下连接到SSL证书Web服务?,java,web-services,ssl,Java,Web Services,Ssl,我正在尝试连接到需要PKCS12证书的SSLwebservice 问题:是否可以不将证书安装到本地密钥库,而是在运行时动态加载它 我做了如下尝试: static { KeyStore.getInstance("PKCS12").load(this.getClass().getClassLoader() .getResourceAsStream("myfile.p12"), "password".toCharArray()); } 但结果是: sun.sec
PKCS12
证书的SSL
webservice
问题:是否可以不将证书安装到本地密钥库,而是在运行时动态加载它
我做了如下尝试:
static {
KeyStore.getInstance("PKCS12").load(this.getClass().getClassLoader()
.getResourceAsStream("myfile.p12"), "password".toCharArray());
}
但结果是:
sun.security.validator.validator异常:PKIX路径生成失败。
sun.security.provider.certpath.SunCertPathBuilderException:无法
找到请求目标的有效证书路径
所以很明显,它不起作用。但是为什么呢
旁注:链接的SO问题没有回答我的问题,因为它的目标是
信任库
,但我的问题是关于密钥库
问题是,尽管您的密钥库已经创建并加载了您的客户端证书(假设它一切正常),但SSLContext没有配置为使用它
尝试:
问题与此代码无关。您的信任库不信任服务器的证书。如果它是自签名的,则必须导入它。更好的是,让CA对其进行签名。它需要在CERTSTORE中,因为java使用CERTSTORE来验证证书(密钥存储是不同的)。您可能可以用另一种方式来实现这一点,但您必须编写大量复杂的代码-检查另一个问题以了解如何将证书动态添加到certstore:@Augusto,但没有
TrustManagerFactory.getInstance(“PKCS12”)代码>。我刚从Web服务所有者那里收到4个文件:crt、csr、key、p12
。现在我正试图通过httpshttps
连接到该Web服务。也许我做错了?@membersound有点奇怪。。。他们给你私钥了吗?或者这是应该做的?(这仍然很奇怪,因为这样他们就可以得到你的私钥副本)。这个谜题肯定少了一块。。。如果没有这一点,我不确定其他人是否能够提供帮助。事实上,您的回答是正确的:服务器提供了一个自签名证书。我将TrustStoreManager配置为始终信任服务器证书,这解决了错误。作为keystore
文件,我从crt+key
创建了自己的pfx
。我假设如果他们给了我通行证,我本可以使用提供的p12
,但他们没有。我还假设我不应该作为客户机收到csr
密钥。
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);