Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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
“;PKIX路径生成失败”;从Java发出HTTP请求时出错_Java_Http_Ssl - Fatal编程技术网

“;PKIX路径生成失败”;从Java发出HTTP请求时出错

“;PKIX路径生成失败”;从Java发出HTTP请求时出错,java,http,ssl,Java,Http,Ssl,因此,您遇到了传说中的PKIX路径构建问题。它看起来像这样吗 javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径生成失败 我打赌是的。我真诚地希望,在你花几个小时沮丧而徒劳地上网寻找拯救自己的方法之前,你已经发现了这个问题 让我们从一个较高的层次来审视问题所在,然后深入探讨具体的解决方案。(大西洋信贷银行) 免责声明对于那些渴望将此标记为重复的人:有许多问题与PKIX路径构建相关

因此,您遇到了传说中的PKIX路径构建问题。它看起来像这样吗

javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径生成失败

我打赌是的。我真诚地希望,在你花几个小时沮丧而徒劳地上网寻找拯救自己的方法之前,你已经发现了这个问题

让我们从一个较高的层次来审视问题所在,然后深入探讨具体的解决方案。(大西洋信贷银行)

免责声明对于那些渴望将此标记为重复的人:有许多问题与PKIX路径构建相关,但它们都围绕着核心问题。从遇到这个问题的个人经验(并花了很多时间试图解决它)我知道过滤掉噪音有多难。我写这个问题是为了简单而优雅地描述错误的原因,以及如何最快速地解决它。如果有帮助,请随意编辑以添加有意义的详细信息。

Java证书 每当Java试图通过TLS连接到另一个应用程序时 (SSL)(例如:HTTPS、IMAPS、LDAP),它将只能连接到 如果应用程序可以信任它,那么它将启动该应用程序。在公司中处理信任的方式 Java世界就是你有一个密钥库(通常是 $JAVA_HOME/lib/security/cacerts),也称为信任库。这 包含所有已知证书颁发机构(CA)证书的列表。 Java将只信任由这些CA之一签名的证书 或已存在于该密钥库中的证书

因此,如果服务器呈现给您( 客户端)自签名的证书(CA没有签名)或Java信任库中不存在的证书。Java不信任证书,无法连接到应用程序。这让您感到悲伤,并且盯着一个
PKIX路径构建失败的
错误

解决方案 通常,此问题的解决方案是获取您试图向其发出请求的主机的公共证书,并将该证书添加到您的tru中 商店。听起来很简单,对吧?应该是

1。获取证书

您可以使用以下命令获取主机的公共证书:
openssl s\u client-connect:
。这将向控制台输出给定主机和端口的证书列表和其他无用信息。您要做的是查找并复制从
开始证书
结束证书
的行。或者,您可以通过稍微扩展命令将此内容直接写入文件:
openssl s|u client-connect:public.crt
public.crt
的内容应如下所示:

-----BEGIN CERTIFICATE----- 
< Certificate content as fetched by the command line.  Don't change this
 content, only remove what is before  and after the BEGIN CERTIFICATE and
 END CERTIFICATE.  That's what your Sed command is doing for you :-) >
-----END CERTIFICATE-----  
----开始证书------
<通过命令行获取的证书内容。不要改变这个
内容,仅删除BEGIN证书前后的内容,并
结束证书。这就是Sed命令为您所做的:-)>
-----结束证书------
2。将证书导入信任库

您需要将新发现的
public.crt
导入信任库,当从java应用程序运行的任何地方发出HTTP请求时,信任库将被使用。这可以通过类似于
/bin/keytool-import-alias-keystore-file public.crt
的方法实现

您可以将证书添加到cacerts中,通常在这里这样的地方
/jre/lib/security/cacerts
,或者直接添加到truststore.jks本身(这是我最近一直在做的事情)

完成此操作后,您(客户端)现在信任服务器将提供的证书,并且您将能够发出http请求。如果您仍然收到错误,最可能的原因是您没有将证书添加到正确的信任库。查看信任库通常居住的位置```

松散引用: