2

我写了一个 web 服务客户端,现在无法让它通过 https 运行。虽然我将 cert.pfx(alias=cert) 导入 javas cacerts 并成功添加了一个带有 certs 别名的条目。

我仍然不能在 wsdl url 上使用 wsimport 提示。它说:PKIX 路径构建失败,无法找到请求目标的有效证书路径。哦,那好吧。所以我进行了一些研究并尝试将其设置为

setlocal set _JAVA_OPTIONS=%_JAVA_OPTIONS%
-Djavax.net.ssl.trustStore="C:\Program Files\Java\jdk1.7.0_79\jre\lib\security\cacerts"
-Djavax.net.ssl.trustStorePassword=changeit -Djavax.net.ssl.keyStoreType=PKCS12 -Djavax.net.ssl.keyStorePassword=xxxxxxxxx -Djavax.net.ssl.keyStore="d:\cert.pfx" "C:\Program Files\Java\jdk1.7.0_79\bin\wsimport" -s C:\Users\me\keystore\bin\s
-keep https://service.xxxxxxxxxxx.de/xxxxxxxxxxxxTest?wsdl endlocal

没有成功。

我还尝试从 cert.pfx 文件中导出证书,然后通过 keytool -exportcert 和 keytool -importcert 将证书导入 cacerts。后来我尝试从我的浏览器导出证书(因为我的浏览器处理证书很好并且可以访问 https url)。我将根证书导出到 root.cer 文件中,然后将此 .cer 导入到我的 cacerts 中(我必须使用与 cert 不同的别名。使用 cert 作为别名时,我在使用 keytool 时在控制台中收到“密钥不匹配”消息迅速的)。

cacerts 上的转储表明 cacerts 中确实有一个条目。我不明白为什么 java 拒绝在 url 上执行 wsimport。

最后,我只是将 url 目标下载到我的机器上,并对下载的 .xml 文件进行了 wsimport,然后更改了生成的存根中的 url 参数。但是没有帮助,因为当我运行应用程序时,我遇到了“PKIX ...无法找到请求目标的有效证书路径”错误。

4

1 回答 1

1

在尝试修改 jvm 选项之前,您还需要将 *.der 证书导入您的密钥库。

以下是如何导入证书以修复以下错误的总体摘要:

尝试执行请求时出错。javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径

如何导入证书

  1. 在浏览器中转到 URL,单击 HTTPS 证书链(URL 地址旁边的小锁符号)以导出证书
    • 单击“更多信息”>“安全”>“显示证书”>“详细信息”>“导出..”。
    • 另存为.der
    • 对您需要导入的任何证书重复此操作
  2. 找到$JAVA_HOME/jre/lib/security/cacerts
  3. 使用以下命令将所有 *.der 文件导入 cacerts 文件:

    sudo keytool -import -alias mysitestaging -keystore $JAVA_HOME/jre/lib/security/cacerts -file staging.der
    sudo keytool -import -alias mysiteprod -keystore  $JAVA_HOME/jre/lib/security/cacerts -file prod.der
    sudo keytool -import -alias mysitedev -keystore  $JAVA_HOME/jre/lib/security/cacerts -file dev.der
    
  4. 默认密钥库密码是“changeit”

  5. 您可以查看使用显示证书指纹的此命令所做的更改。

    keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts
    
  6. 如果这不能解决问题,请尝试将这些 java 选项添加为参数:

    -Djavax.net.ssl.trustStore="$JAVA_HOME/jre/lib/security/cacerts"
    -Djavax.net.ssl.trustStorePassword="changeit"
    
于 2016-10-18T19:46:02.053 回答