我是JAVA的新手,在web服务客户端项目中使用web服务(.wsdl)。我在jrd中的javacacerts存储中导入客户端证书。我的代码如下:
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
我不知道为什么会有例外。任何帮助都将不胜感激。
您可能需要在证书中添加密钥链(PEM格式)。
CA根->中间证书->证书
或者在密钥库中找不到证书,您是否使用了正确的别名等。
我不认识您使用的SOAP JAX-WS实现。
不是问题的解决方案,但找到它可能会有所帮助:您可以使用VM参数-Djavax.net.debug=all
启动客户端,该参数将为您提供有关SSL连接的大量信息。
点击此处查看有关输出的详细信息:
https://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/ReadDebug.html
直接使用-Djavax.net.ssl.trustStore属性。
你使用的服务器还有一件事,那就是你需要放置用于握手的jks。
例如服务器是JBoss然后是bin
我猜您的cacert不正确或者路径不可访问。我按照这里给出的说明
使用SSL Poke验证连接
- 下载SSLPoke.class
-
按如下方式执行类,更改URL和端口:
$JAVA_HOME/bin/JAVA SSLPoke yoururl 443
-
成功的连接如下所示:
$JAVA_HOME/bin/JAVA SSLPoke yoururl 443
成功连接
-
尝试使用不同的信任存储来连接
$JAVA_HOME/bin/JAVA-Djavax.net.ssl.trustStore=[PATH]/cacerts.jks SSLPoke yoururl 443
如果失败,信任库将不包含正确的证书。
如何解决
溶液从这里提取
-
再次从服务器获取证书:
openssl s_client-连接您的URL:443
您需要openssl。将输出保存到一个名为public.crt的文件中
-----BEGIN CERTIFICATE-----
< Bunch of lines of your certificate >
-----END CERTIFICATE-----
导入证书:
$JAVA_HOME/bin/keytool-导入-别名-密钥库$JAVA_HHOME/jre/lib/security/cacerts-文件public.crt
提示时输入密码(默认为changeit)
推荐
在同一篇文章中,不建议使用与JVM cacert不同的配置的trustStore,因为那样java就无法访问其他根证书。
在处理SSL上的soap服务时,这是一个非常常见的错误,我已经遇到过几次了。
您的证书可能未正确安装在信任库中。
您可以使用openssl在信任库中检查并安装正确的证书,如下所述
Hi看起来证书没有正确导入,或者代码中使用的路径没有指向正确的密钥库。
我希望下面文章中的以下步骤能对你有所帮助。
http://magicmonster.com/kb/prg/java/ssl/pkix_path_building_failed.html