Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不安装密钥库的情况下连接到SSL证书Web服务?_Java_Web Services_Ssl - Fatal编程技术网

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
。现在我正试图通过https
https
连接到该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);