使用JAVA中的基于安全SOAP的web服务时出错



我是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验证连接

  1. 下载SSLPoke.class
  2. 按如下方式执行类,更改URL和端口:

    $JAVA_HOME/bin/JAVA SSLPoke yoururl 443

  3. 成功的连接如下所示:

    $JAVA_HOME/bin/JAVA SSLPoke yoururl 443

    成功连接

  4. 尝试使用不同的信任存储来连接

    $JAVA_HOME/bin/JAVA-Djavax.net.ssl.trustStore=[PATH]/cacerts.jks SSLPoke yoururl 443

如果失败,信任库将不包含正确的证书。

如何解决

溶液从这里提取

  1. 再次从服务器获取证书:

    openssl s_client-连接您的URL:443

您需要openssl。将输出保存到一个名为public.crt的文件中

-----BEGIN CERTIFICATE-----
< Bunch of lines of your certificate >
-----END CERTIFICATE-----
  1. 导入证书:

    $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

相关内容

  • 没有找到相关文章

最新更新