Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解析javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径生成失败错误?_Java_Ssl_Https - Fatal编程技术网

解析javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径生成失败错误?

解析javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径生成失败错误?,java,ssl,https,Java,Ssl,Https,编辑:-在我的网站上尝试以更形象的方式编排问题格式并接受答案 这是原版 我得到这个错误: 详细消息sun.security.validator.validator异常:PKIX路径 生成失败: sun.security.provider.certpath.SunCertPathBuilderException:无法 找到请求目标的有效证书路径 导致javax.net.ssl.SSLHandshakeException的原因: sun.security.validator.validator异常:

编辑:-在我的网站上尝试以更形象的方式编排问题格式并接受答案

这是原版

我得到这个错误:

详细消息sun.security.validator.validator异常:PKIX路径 生成失败:
sun.security.provider.certpath.SunCertPathBuilderException:无法 找到请求目标的有效证书路径

导致javax.net.ssl.SSLHandshakeException的原因: sun.security.validator.validator异常:PKIX路径生成 失败:sun.security.provider.certpath.SunCertPathBuilderException: 找不到请求目标的有效证书路径

我使用Tomcat6作为Web服务器。我有两个HTTPS web应用程序安装在同一台机器上不同端口的不同Tomcat上。说出
App1(端口8443)
App2(端口443)
<代码>应用程序1连接到
应用程序2
。当
App1
连接到
App2
时,我得到上述错误。我知道这是一个非常常见的错误,所以在不同的论坛和网站上遇到了许多解决方案。我在两个Tomcat的
server.xml
中都有以下条目:

keystoreFile="c:/.keystore" 
keystorePass="changeit"
每个站点都说明了相同的原因,即app2提供的证书不在app1 jvm的受信任存储中。这似乎也是真的,当我尝试在IE浏览器中点击相同的URL时,它也能工作(随着变暖,这个网站的安全证书有问题。这里我说继续访问这个网站)。但是当Java客户机(在我的例子中)命中相同的URL时,我得到了上面的错误。因此,为了将其放入truststore,我尝试了以下三种选择:

选项1

System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
选项2 环境变量中的以下设置

CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
选项3 环境变量中的以下设置

CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
但没有任何效果

最后起作用的是执行Pascal Thivent建议的Java方法,即执行程序InstallCert

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

我想知道 当我提到
app2
server的
server.xml
中的相同值以及truststore中的相同值时,为什么上面提到的三种方法不起作用

System.setProperty(“javax.net.ssl.trustStore”、“C:/.keystore”)和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\u HOME%\lib\security\cacerts

首先,您可以通过运行以下命令检查您的证书是否已在信任库中:
keytool-list-keystore”%JAVA\u HOME%/jre/lib/security/cacerts“
(您不需要提供密码)

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


keytool-import-noprompt-trustcacerts-alias。

您需要将App2的证书添加到位于
%JAVA\u HOME%\lib\security\cacerts
的所用JVM的信任库文件中

首先,您可以通过运行以下命令检查您的证书是否已在信任库中:
keytool-list-keystore”%JAVA\u HOME%/jre/lib/security/cacerts“
(您不需要提供密码)

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

keytool-import-noprompt-trustcacerts-alias

javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径生成失败:sun.security.provider.certpath.SunCertPathBuilderException:找不到请求目标的有效证书路径

•当我遇到错误时,我试图用谷歌搜索出表达式的含义,我发现,当服务器更改其HTTPS SSL证书,并且我们的旧版本java无法识别根证书颁发机构(CA)时,就会出现此问题

•如果您可以在浏览器中访问HTTPS URL,则可以更新Java以识别根CA

•在浏览器中,转到Java无法访问的HTTPS URL。单击HTTPS证书链(Internet Explorer中有锁图标),单击锁以查看证书

•转到证书的“详细信息”和“副本存档”。以Base64(.cer)格式复制它。它将保存在您的桌面上

•安装证书时忽略所有警报

•这是我收集试图访问的URL的证书信息的方式

现在我必须使我的java版本了解证书,这样它就不会拒绝识别URL。在这方面,我必须提到,我用谷歌搜索出根证书信息默认保留在JDK的\jre\lib\security位置,访问的默认密码是:changeit.

要查看cacerts信息,请遵循以下步骤:

•单击开始按钮-->运行

•键入cmd。命令提示符打开(您可能需要以管理员身份打开它)

•转到您的
Java/jreX/bin
目录

•键入以下内容

keytool-list-keystored:\Java\jdk1.5.0\u 12\jre\lib\security\cacerts

它给出密钥库中包含的当前证书的列表。它看起来像这样:

C:\Documents and Settings\NeelanjanaG>keytool-list-keystore D:\Java\jdk1.5.0\u 12\jre\lib\security\cacerts

输入密钥库
cp /tmp/cacerts /etc/ssl/certs/java/cacerts
/home/mcp01$ **ps -ef |grep tomcat**
tomcat7  28477     1  0 10:59 ?        00:00:18 **/usr/local/java/jdk1.7.0_15/bin/java** -Djava.util.logging.config.file=/var/lib/tomcat7/conf/logging.properties -Djava.awt.headless=true -Xmx512m -XX:+UseConcMarkSweepGC -Djava.net.preferIPv4Stack=true -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/share/tomcat7/endorsed -classpath /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/var/lib/tomcat7 -Dcatalina.home=/usr/share/tomcat7 -Djava.io.tmpdir=/tmp/tomcat7-tomcat7-tmp org.apache.catalina.startup.Bootstrap start
1005     28567 28131  0 11:34 pts/1    00:00:00 grep --color=auto tomcat
import java.io.DataOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class HTTPSPlayground {
    public static void main(String[] args) throws Exception {

        URL url = new URL("https:// ... .com");
        HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();

        httpURLConnection.setRequestMethod("POST");
        httpURLConnection.setRequestProperty("Accept-Language", "en-US,en;q=0.5");
        httpURLConnection.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(httpURLConnection.getOutputStream());

        String serializedMessage = "{}";
        wr.writeBytes(serializedMessage);
        wr.flush();
        wr.close();

        int responseCode = httpURLConnection.getResponseCode();
        System.out.println(responseCode);
    }
}
echo -n | openssl s_client -connect <your domain>:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/<your domain>.crt
keytool -import -v -trustcacerts -alias <your domain> -file ~/<your domain>.crt -keystore <JAVA HOME>/jre/lib/security/cacerts -keypass changeit -storepass changeit
String certificatesTrustStorePath = "<JAVA HOME>/jre/lib/security/cacerts";
System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath);

// ...
String certificatesTrustStorePath = "/etc/alternatives/jre/lib/security/cacerts";
System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath);
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.X509TrustManager;

public class TrustAnyTrustManager implements X509TrustManager {

  public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  }

  public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  }

  public X509Certificate[] getAcceptedIssuers() {
    return null;
  }
}
             HttpsURLConnection conn = null;
             URL url = new URL(serviceUrl);
             conn = (HttpsURLConnection) url.openConnection();
             SSLContext sc = SSLContext.getInstance("SSL");  
             sc.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());  
                    // Create all-trusting host name verifier
             HostnameVerifier allHostsValid = new HostnameVerifier() {
               public boolean verify(String hostname, SSLSession session) {
                return true;
              }
            };
            conn.setHostnameVerifier(allHostsValid);
System.setProperty("org.jboss.security.ignoreHttpsHost","true");
sudo keytool -–importcert -file /PathTo/YourCertFileDownloadedFromBrowserLockIcon.crt -keystore /Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/jre/lib/security/cacerts -alias "Cert" -storepass changeit
<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>http://updates.jenkins.io/update-center.json</url>
  </site>
</sites>
cd ~
apk add openssl
openssl s_client -connect <host-dns-ssl-belongs> < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > public.crt
sudo $JAVA_HOME/bin/keytool -import -alias server_name -keystore $JAVA_HOME/lib/security/cacerts -file public.crt -storepass changeit -noprompt
# locate cacerts    
/usr/java/jdk1.8.0_221-amd64/jre/lib/security/cacerts
/usr/java/jre1.8.0_221-amd64/lib/security/cacerts
cp /path_of_jks_file/file.jks /usr/java/jdk1.8.0_221-amd64/jre/lib/security/cacerts
cp /path_of_jks_file/file.jks /usr/java/jre1.8.0_221-amd64/lib/security/cacerts