在JAVA中消费安全SOAP基础Web服务时出现错误。

3

我是JAVA的新手,我正在Web服务客户端项目中使用(.wsdl)消费Web服务。我将客户端证书导入到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

我不知道为什么会有异常。希望能得到帮助。


这是使用Apache CXF作为Web服务客户端吗?它在cxf.xml文件中使用自己的SSL设置 - 更多细节请参见此处 - df778899
你确定你的信任存储库名称是 cacerts.jks 而不仅仅是 cacerts 吗? - Prasann
我也试过使用cacerts。 - Nomi Ali
6个回答

3

你可能需要在证书(PEM格式)中添加密钥链。

CA根证书 -> 中间证书 -> 证书。

否则,密钥库中找不到证书,请确认使用正确的别名等。

我不认识你正在使用的SOAP JAX-WS实现。


2
这并不是解决你问题的方法,但或许可以帮助你找到答案:你可以在客户端使用VM参数-Djavax.net.debug=all启动,这将为你提供有关SSL连接的大量信息。
点击此处查看输出的详细信息。

2

直接使用-Djavax.net.ssl.trustStore属性。

还有一件事,您需要在使用的服务器上放置jks以进行握手。

例如,如果服务器是JBoss,则为bin。

最初的回答


2
我猜测你的cacert不正确或路径无法访问。我按照这里给出的说明操作。

使用SSL Poke验证连接性

  1. 下载SSLPoke.class
  2. 执行以下类,更改URL和端口:

    $JAVA_HOME/bin/java SSLPoke yoururl 443

  3. 成功的连接应该像这样:

    $JAVA_HOME/bin/java SSLPoke yoururl 443

    Successfully connected

  4. 尝试使用不同的信任库进行连接

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

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

如何解决

解决方案从这里提取。

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

    openssl s_client -connect yoururl:443

您需要openssl。将输出保存到名为public.crt的文件中。这是您的文件应该看起来的样子:

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

    $JAVA_HOME/bin/keytool -import -alias <别名> -keystore $JAVA_HOME/jre/lib/security/cacerts -file public.crt

如果提示输入密码(默认为changeit),请键入密码。

建议

在同一帖子中不建议使用配置的trustStore不同于JVM cacert,否则Java无法访问其他根证书。


0
这是在处理 SSL 上的 SOAP 服务时遇到的一个常见错误,我遇到过几次。
您的证书可能未正确安装在信任存储中。
您可以使用 OpenSSL 来检查并将正确的证书安装在信任存储中,如 此处 所述。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接