【问题标题】:Error while consuming secure SOAP base web service in JAVA在 JAVA 中使用基于安全 SOAP 的 Web 服务时出错
【发布时间】:2019-01-31 07:34:51
【问题描述】:

我是 JAVA 新手,在 Web Service Client 项目中使用 web service(.wsdl)。我在 jrd 中的 java cacerts 商店中导入客户端证书。我的代码如下:

        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 设置 - 更多详细信息 here
  • 您确定您的信任库的名称是cacerts.jks 而不仅仅是cacerts
  • 我也尝试过使用 cacerts。

标签: java web-services soap


【解决方案1】:

您可能必须在证书(PEM 格式)中添加密钥链。

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

或者在keystore中找不到证书,是否使用了正确的别名等。

而且我不认识您使用的 SOAP JAX-WS 实现。

【讨论】:

    【解决方案2】:

    不能解决您的问题,但也许有助于找到它: 您可以使用 VM 参数 -Djavax.net.debug=all 启动客户端,这将为您提供有关 SSL 连接的大量信息。

    在此处查看有关输出的详细信息:

    https://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/ReadDebug.html

    【讨论】:

      【解决方案3】:

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

      您使用的服务器还需要放置 jks 以进行握手。

      例如服务器是 JBoss 然后是 bin

      【讨论】:

        【解决方案4】:

        我猜你的 cacert 不正确或路径不可访问。我按照here的说明进行操作

        使用 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

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

        如何解决

        解决方案提取自here

        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)

        推荐

        在同一篇文章中,不建议使用与 JVM cacert 不同的配置 trustStore,因为这样 java 无法访问其他根证书。

        【讨论】:

          【解决方案5】:

          这是通过 SSL 处理肥皂服务时非常常见的错误,我遇到过几次。

          您的证书可能未正确安装在您的信任库中。

          您可以使用 openssl 检查并在信任库中安装正确的证书,如 here 所述

          【讨论】:

            【解决方案6】:

            您好,证书似乎未正确导入,或者代码中使用的路径未指向正确的密钥库。

            希望以下文章中的步骤对您有所帮助。

            http://magicmonster.com/kb/prg/java/ssl/pkix_path_building_failed.html

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-12-30
              • 2012-02-23
              • 1970-01-01
              • 2023-03-06
              • 1970-01-01
              • 2015-08-30
              • 1970-01-01
              相关资源
              最近更新 更多