当前位置: 首页 > 面试题库 >

解决javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败错误?

赏高格
2023-03-14
问题内容

我收到此错误:

detailed message sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

cause 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

我正在使用Tomcat 6作为Web服务器。我有两个HTTPS Web应用程序安装在不同端口上但在同一台机器上的不同Tomcat上。说App1(port 8443)和 App2(port 443)。App1连接到App2。当App1连接到App2我得到以上错误。我知道这是一个非常常见的错误,因此在不同的论坛和站点上遇到了许多解决方案。我在server.xml两个Tomcat中都有以下条目:

keystoreFile="c:/.keystore" 
keystorePass="changeit"

每个站点都表示由app2颁发的证书不在app1 jvm的受信任存储区中的相同原因。当我尝试在IE浏览器中命中相同的URL时,这似乎也是正确的(工作正常,此网站的安全证书有问题。在这里我说继续浏览此html" target="_blank">网站)。但是,当Java客户端(在我的情况下)命中相同的URL时,会出现上述错误。因此,将其放入信任库中,我尝试了以下三个选项:

Option1

System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

Option2 在环境变量中进行以下设置

CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value

Option3 在环境变量中进行以下设置

JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value

但是没有任何效果。

最后 执行的工作是执行如何使用Apache HttpClient处理无效的SSL证书中建议的Java方法?由Pascal Thivent设计,即执行程序InstallCert。

但是这种方法对于devbox设置来说很好,但是我不能在生产环境中使用它。

我很奇怪,为什么三种方法时,我已经中提到的相同值上面提到没有工作server.xml的app2服务器和相同的价值观在信任的设置

System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

app1程序中。

有关更多信息,这是我进行连接的方式:

URL url = new URL(urlStr);

URLConnection conn = url.openConnection();

if (conn instanceof HttpsURLConnection) {

  HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection();

  conn1.setHostnameVerifier(new HostnameVerifier() {
    public boolean verify(String hostname, SSLSession session) {
      return true;
    }
  });

  reply.load(conn1.getInputStream());

问题答案:

需要将App2的证书添加到位于的使用的JVM的信任库文件中%JAVA_HOME%\lib\security\cacerts

首先,你可以通过运行以下命令来检查证书是否已在信任库中:( keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts"不需要提供密码)

如果你的证书丢失,可以通过使用浏览器下载证书并将其添加到信任库中,使用以下命令:

keytool -import -noprompt -trustcacerts -alias <AliasName> -file   <certificate> -keystore <KeystoreFile> -storepass <Password>

导入后,你可以再次运行第一个命令以检查是否已添加证书。

可在此处找到Sun / Oracle信息。



 类似资料:
  • 我已经研究了可能的原因,并按照以下步骤创建了一个包含外部应用程序证书的truststore: 从浏览器下载证书链 使用创建truststore keytool-import-v-trustcacerts-alias mycert-file x_my_cert_location_x-keystore truststore null 在SSL调试中,我可以看到: 对我来说毫无意义。我的应用程序在Jav

  • 我使用以下命令创建了CSR请求: openssl请求-out CertificateCsr.csr-new-newkey rsa:2048-keyout CertificateKey.key 之后,CA将与我共享证书(.cer)文件。 在此之后,我使用key将.cer文件转换为.p12。 使用CA发送的cer和私钥创建.p12证书 C:\Java\jdk1.6.0_38\jre\bin>opens

  • Sun.Security.Validator.ValidatorException:PKIX路径生成失败:Sun.Security.Provider.CertPath.SunCertPathBuilderException:找不到请求目标的有效证书路径;嵌套异常为javax.net.ssl.sslHandShakeException:Sun.Security.Validator.Validator

  • 我刚刚为我们的域名购买了一个新的通配符ssl证书,因为我们的旧证书即将到期。我已经将它安装在我们的cas服务器和应用服务器上,但是我在我们的应用服务器上得到以下堆栈跟踪: 两个服务器上的证书是相同的。

  • 我正在使用一个自定义的工件库来部署我的项目。当我在本地机器上工作时,这很好,但我已经启用了Gitlab的AutoDevOps功能,并将我的项目与Kubernetes集群集成。 kubernetes集群由rancher管理。 问题是在Gitlab上运行的构建失败并出现以下错误: 插件org.apache.maven。插件:maven resources插件:2.6或其一个依赖项无法解析:无法读取or

  • 编辑:这个问题的第一个版本给人的印象是我的问题与Maven有关。我修改了措辞,以便更多地关注JDK。 我得到时,试图使用Java联系任何支持SSL的服务。对其他相关问题的回答并没有阻止我的错误。 null 众所周知的解决这个问题的方法似乎不起作用。我如何才能停止错误,修复我的JDK,并最终再次使用支持SSL的服务?