Web 客户端应用程序收到 "unable to find valid certification path to requested target"

Web Client Application receives a "unable to find valid certification path to requested target"

我通过创建自定义证书成功地在远程服务器上的我的 weblogic 上配置了 HTTPS。

在客户端(与 运行 weblogic 不同的计算机),我使用从互联网上获得的 InstallCert.java 资源文件安装了服务器证书。我将 jssecacerts 文件复制到我的 JAVA_HOME/jre/lib/security/ 文件夹中,并编写了一个简单的 JAX-WS 独立应用程序来测试它:

URL url = new URL("https://IP:Port/app/service?wsdl");
QName qname = new QName("http://service.org/", "queryservice");

HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> hostname.equals(IP));

Service service = Service.create(url, qname);
QueryService port = service.getPort(QueryService.class);

而且成功了!伟大的。精彩的。所以我在我的 web 应用程序上实现了同样的东西,将它部署在我笔记本电脑上的 weblogic 服务器上,然后我尝试访问相同的 web 服务,就像我的独立应用程序一样,我不断收到 sun.security.provider.certpath.SunCertPathBuilderException: 无法找到请求目标的有效证书路径异常。

我检查了几个教程,他们一直在说同样的话:一旦我将 jssecacerts 文件放入 JAVA_HOME/jre/lib/security/ 中,一切都应该没问题。

有什么我遗漏的吗?

好的。事实证明,weblogic 客户端服务器仅将 JRE 中的 cacerts 视为已识别的密钥库,而不是 jssecacerts。我不得不从 jssecacerts 导出服务器证书并将其导入 cacerts - 我错过了一个重要的步骤。

这些是步骤:

  1. 从此处获取 InstallCert.java 文件后:https://github.com/escline/InstallCert、运行 java InstallCert [host]:[port](当您 运行 命令时,输入要添加到列表中的证书的给定列表编号 - 可能只是 1)
  2. 运行 命令,keytool -exportcert -alias [host]-1 -keystore jssecacerts -storepass changeit -file [host].cer
  3. 然后 运行 这个命令:keytool -importcert -alias [host] -keystore [系统密钥库路径] -storepass changeit -file [host].cer

之后,你应该会没事的。您的系统密钥库应该是 cacerts。