我是JAVA的新手,正在使用 Web Service Client 项目中的Web服务(.wsdl)。我将客户端证书导入到 jrd 中的java 证书存储中。我的代码如下:
System.setProperty("javax.net.ssl.trustStore","[PATH]/cacerts.jks");
System.setProperty("javax.net.ssl.trustStorePassword","changeit");
ServicesProxy service = new ServicesProxy();
ServiceRequest request = new ServiceRequest(1498);
ServiceResponse response = service.getDetails(request);
握手失败,出现以下异常:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:
PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
我不知道为什么会有例外。任何帮助将不胜感激。
答案 0 :(得分:3)
您可能必须在证书(PEM格式)中添加密钥链。
CA根->中级证书->证书。
或者在密钥库中找不到证书,是否使用正确的别名等
我无法识别您使用的SOAP JAX-WS实现。
答案 1 :(得分:2)
不是您问题的解决方案,但也许可以帮助您找到问题:
您可以使用VM参数-Djavax.net.debug=all
启动客户端,这将为您提供有关SSL连接的大量信息。
在此处查看有关输出的详细信息:
https://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/ReadDebug.html
答案 2 :(得分:2)
直接使用-Djavax.net.ssl.trustStore属性。
您要在服务器中使用的另一件事是,您还需要放置jks进行握手。
例如,服务器是JBoss,然后是bin
答案 3 :(得分:2)
我猜您的证书不正确或路径不可访问。我按照here
的说明进行操作使用SSL Poke验证连接性
按如下所示执行类,更改URL和端口:
$ JAVA_HOME / bin / java SSL拨您的网址443
成功的连接如下所示:
$ JAVA_HOME / bin / java SSL拨您的网址443
成功连接
尝试使用其他信任库进行连接
$ JAVA_HOME / bin / java -Djavax.net.ssl.trustStore = [PATH] /cacerts.jks SSLPoke yoururl 443
如果失败,信任库将不包含正确的证书。
解决方法
解决方案是从here
中提取的再次从服务器获取证书:
openssl s_client-连接yoururl:443
您需要openssl。将输出保存到名为public.crt的文件中。这是您文件的外观:
-----BEGIN CERTIFICATE-----
< Bunch of lines of your certificate >
-----END CERTIFICATE-----
导入证书:
$ JAVA_HOME / bin / keytool-导入-别名-keystore $ JAVA_HOME / jre / lib / security / cacerts-文件public.crt
根据提示输入密码(默认为changeit)
推荐
在同一篇文章中,不建议使用与JVM cacert不同的已配置trustStore,因为Java无法访问其他根证书。
答案 4 :(得分:0)
答案 5 :(得分:0)
嗨,看来证书未正确导入,或者代码中使用的路径未指向正确的密钥库。
希望下面的文章中的步骤对您有所帮助。
http://magicmonster.com/kb/prg/java/ssl/pkix_path_building_failed.html