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


426

编辑:-试图在我的博客上以更合理的方式格式化问题和接受的答案

这是原始问题。

我收到此错误:

详细消息sun.security.validator.ValidatorException:PKIX路径构建失败:
sun.security.provider.certpath.SunCertPathBuilderException:无法找到到请求目标的有效认证路径

导致javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径

我正在使用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时,这似乎也是正确的(工作正常,此网站的安全证书有问题。在这里我说继续浏览此网站)。但是当Java客户端(在我的情况下)击中相同的URL时,我得到了上面的错误。因此,将其放入信任库中,我尝试了以下三个选项:

选项1

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.xmlapp2服务器和相同的价值观在信任的设置

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());


奇怪的是,在没有SSL问题的群集服务器之间进行通信时,我收到了此错误。正确设置domainnameRHEL服务器后,问题就消失了。希望它可以帮助某人。
DavidG 2014年

要检查的另一件事是您拥有Java的最新版本-因此,我遇到了类似的错误。
Redzarf

stackoverflow.com/questions/2893819/…-也很相关,也是一个很好的答案。
悉达多

Answers:


406

您需要将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信息。


6
您必须使用完整路径,例如c:\ java \ jdk \ lib \ security \ cacerts
SimonSez 2012年

48
就像SimonSez所说的那样,您不需要密码,但是如果需要,默认密码是“ changeit”。
费利克斯

16
另外,在Windows中,您需要以管理员身份运行终端,否则keytool error: java.io.FileNotFoundException ... (Access is denied)在尝试导入证书时会收到错误消息。
菲利克斯

2
啊@SimonSez你是我的上帝。但是要添加它,必须指定@M Sach提到的信任存储位置和密码才能使其正常工作。
BudsNanKis 2013年

2
Java 1.8仍然存在问题。需要按所述添加证书并使用Java <1.8
Tom Howard

180

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

•收到错误消息后,我尝试用Google搜索表达式的含义,然后发现,当服务器更改其HTTPS SSL证书并且我们的Java较旧版本无法识别根证书颁发机构(CA)时,就会发生此问题。 。

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

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

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

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

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

现在,我必须使自己的Java版本知道该证书,以便它不会拒绝识别URL。在这方面,我必须提到,我已经搜索出根证书信息默认情况下保留在JDK的 \ jre \ lib \ security位置,并且要访问的默认密码为:changeit。

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

•单击开始按钮->运行

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

•转到Java/jreX/bin目录

•输入以下内容

keytool -list -keystore D:\ Java \ jdk1.5.0_12 \ jre \ lib \ security \ cacerts

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

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

输入密钥库密码:changeit

密钥库类型:jks

密钥库提供者:SUN

您的密钥库包含44个条目

verisignclass3g2ca,2004年3月26日,trustedCertEntry,

证书指纹(MD5):A2:33:9B:4C:74:78:73:D4:6C:E7:C1:F3:8D:CB:5C:E9

entrustclientca,2003年1月9日,trustedCertEntry,

证书指纹(MD5):0C:41:2F:13:5B:A0:54:F5:96:66:2D:7E:CD:0E:03:F4

thawtepersonalbasicca,1999年2月13日,trustedCertEntry,

证书指纹(MD5):E6:0B:D2:C9:CA:2D:88:DB:1A:71:0E:4B:78:EB:02:41

addtrustclass1ca,2006年5月1日,trustedCertEntry,

证书指纹(MD5):1E:42:95:02:33:92:6B:B9:5F:C0:7F:DA:D6:B2:4B:FC

verisignclass2g3ca,2004年3月26日,trustedCertEntry,

证书指纹(MD5):F8:BE:C4:63:22:C9:A8:46:74:8B:B8:1D:1E:4A:2B:F6

•现在,我必须将以前安装的证书包含在cacerts中。

•为此,请执行以下步骤:

keytool –import –noprompt –trustcacerts –alias ALIASNAME-文件FILENAME_OF_THE_INSTALLED_CERTIFICATE -keystore PATH_TO_CACERTS_FILE -storepass PASSWORD

如果您使用的是Java 7:

keytool –importcert –trustcacerts –alias别名-file PATH_TO_FILENAME_OF_THE_INSTALLED_CERTIFICATE -keystore PATH_TO_CACERTS_FILE -storepass changeit

•然后它将证书信息添加到cacert文件中。

这是我为上述异常找到的解决方案!


5
证书过期后该怎么办?重复所有操作(每年一次)?
ggkmath13 2013年

7
有什么办法以编程方式执行此操作吗?
Meshulam Silk 2014年

1
对于处理PKIX错误的人,“路径不与任何信任锚链接”,不幸的是,此解决方案并没有解决该问题。
IcedD​​ante 2014年

3
一个问题-aliasName是否是我们要导入证书的网址?例如,如果URL为domain.site.com/pages/service.asmx,则别名应为domain.site.com或完整URL(domain.site.com/pages/service.asmx),或者也应添加http前缀://还是只是一个随意的名字?
nanosoft

1
路径:\ lib \ security> keytool-导入-noprompt -trustcacerts -alias webCert -file webCertResource.cer -keystore c:/ Users / Jackie / Desktop -storepass changeit我得到“系统找不到指定的文件”
Jesse

46

如何在Tomcat 7中工作

我想在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);
    }
}

这是解决我的问题的方法:

1)下载.crt文件

echo -n | openssl s_client -connect <your domain>:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/<your domain>.crt
  • <your domain>用您的域替换(例如jossef.com

2).crt在Java的cacerts证书存储区中应用文件

keytool -import -v -trustcacerts -alias <your domain> -file ~/<your domain>.crt -keystore <JAVA HOME>/jre/lib/security/cacerts -keypass changeit -storepass changeit
  • <your domain>用您的域替换(例如jossef.com
  • <JAVA HOME>用您的Java主目录替换

3)破解

即使我在Java默认证书存储区中安装了我的证书,Tomcat仍然忽略了它(似乎未将其配置为使用Java的默认证书存储区)。

要对此进行破解,请在代码中的以下位置添加以下内容:

String certificatesTrustStorePath = "<JAVA HOME>/jre/lib/security/cacerts";
System.setProperty("javax.net.ssl.trustStore", certificatesTrustStorePath);

// ...

4
第2步使用SpringBoot和Tomcat 7为我完成了窍门。谢谢。
蒂姆·佩里

我必须使用tomcat使用的Java的keytool吗?因为在一台服务器上我可以拥有许多Java
vikifor

@vikifor是的。您还可以安装在系统上的所有Java迪尔斯运行
Jossef Harush

1
这工作!感谢吨@JossefHarush这么有用的答案!
汤姆·泰勒

1
将@Jossef Harush的代码段添加到我的代码后,我的问题得到解决。
Chamod Pathirana

10

在我的情况下,问题是Web服务器仅发送证书和中间CA,而不发送根CA。添加此JVM选项解决了该问题:-Dcom.sun.security.enableAIAcaIssuers=true

提供了对Authority Information Access扩展的caIssuers访问方法的支持。为了兼容性,默认情况下禁用它,可以通过设置系统属性来启用它com.sun.security.enableAIAcaIssuers true。

如果设置为true,则Sun的CertPathBuilder的PKIX实现将使用证书的AIA扩展名(除了指定的CertStores之外)中的信息来查找颁发CA证书,只要它是ldap,http或ftp类型的URI。

资源


这实际上解决了我的问题,谢谢!
路易斯·席尔瓦,

6

另一个原因可能是JDK的版本过旧。我使用的是jdk版本1.8.0_60,只需更新到最新版本即可解决证书问题。


2
我也有同样的问题。调用带有Lets Encrypt证书的API可能不适用于Java的较早版本,因为受信任的根证书颁发机构无法识别它。更新Java将解决此问题。
hertg '18

5

我的cacerts文件是完全空的。我通过从Windows计算机(使用Oracle Java 7)复制cacerts文件并将其scp'd到我的Linux机器(OpenJDK)中来解决此问题。

cd %JAVA_HOME%/jre/lib/security/
scp cacerts mylinuxmachin:/tmp

然后在linux机器上

cp /tmp/cacerts /etc/ssl/certs/java/cacerts

到目前为止效果很好。


1
如果问题是您使用的Java版本不具有最新证书,则此方法非常有用。
atripathi 2014年

@atripathi Mac怎么样?
iOSAndroidWindowsWindowsMo​​bileAppsDev

如果cacerts文件为空,则Java安装存在严重问题。您应该已经全部安装了它。
罗恩侯爵

也许可以,但是此解决方案有效,此后再也没有发生任何错误。
瑞安·希灵顿

5

对我来说,尝试连接到正在处理SSL的NGINX反向代理背后的进程时,也会出现此错误。

事实证明,问题出在没有整个证书链串联的证书。当我添加中间证书时,问题就解决了。

希望这可以帮助。


多数民众赞成在看起来像我有。您能解释一下如何添加中间证书以及在何处添加。我使用httpd反向代理而不是NGINX。
Asaf Magen

就我而言,这对我有所帮助,因为我使用httpd:access.redhat.com/solutions/43575
Asaf Magen

使用nginx时,它仅将.key和.pem文件用于SSL配置。首先,您将.crt转换为.pem(简单地:cp yourfile.crt yourfile.pem),然后使用SSL证书链:将.cer文件附加到.pem的最后一个(cat yourfile.cer >> yourfile.pem)
ThếAnhNguyễn19年

5

在Linux下使用Tomcat 7可以达到目的。

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

在Linux下,$JAVA_HOME并非总是设置,但通常/etc/alternatives/jre指向$JAVA_HOME/jre


5

下面的代码为我工作:

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 new X509Certificate[] {};
}
}

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());  

             conn.setSSLSocketFactory(sc.getSocketFactory());

5
此代码是完全不安全的,不应使用。
罗恩侯爵,

@ user207421为什么不安全?代码中简短地发生了什么。
Govinda Sakhare '19

这将跳过所有证书验证,基本上是允许任何证书被接受。证书的工作方式是,在各个证书颁发机构中都有(从字面上)受到物理保护的根证书。然后,该证书用于发布其他辅助证书,这些证书可以一直返回到根证书颁发机构。这将跳过所有上游检查,这意味着即使我的身份未得到验证,我也可以发送任何ssl证书(甚至是自生成的),并且您的应用程序将其视为安全的。
斯科特·泰勒

4

我在用 jdk1.8.0_171当我遇到相同的问题时,。我在这里尝试了前2个解决方案(使用keytool添加证书,以及另一个具有hack的解决方案),但是它们对我不起作用。

我将我的JDK升级到了1.8.0_181它,它就像一个魅力。


2

我写了一个小的win32(WinXP 32bit testet)愚蠢的cmd(命令行)脚本,该脚本在程序文件中查找所有Java版本并向它们添加证书。密码需要为默认的“ changeit”或在脚本中自行更改:-)

@echo off

for /F  %%d in ('dir /B %ProgramFiles%\java') do (
    %ProgramFiles%\Java\%%d\bin\keytool.exe -import -noprompt -trustcacerts -file some-exported-cert-saved-as.crt -keystore %ProgramFiles%\Java\%%d\lib\security\cacerts -storepass changeit
)

pause

2

对于MacOS X,以下是对我有用的确切命令,其中我不得不在'importcert'选项中尝试使用双连字符:

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

2

对我来说,这篇文章中公认的解决方案不起作用:https : //stackoverflow.com/a/9619478/4507034

相反,我设法通过将证书导入到我的计算机信任的证书中来解决了这个问题。

脚步:

  1. 转到https://localhost:8443/yourpath证书无效的网址(例如)。
  2. 如上述文章所述,导出证书。
  3. 在Windows机器上打开: Manage computer certificates
  4. 转到Trusted Root Certification Authorities->Certificates
  5. your_certification_name.cer文件导入此处。

1

对于在Ubuntu服务器上运行的Tomcat,要找出正在使用的Java,请使用“ ps -ef | grep tomcat”命令:

样品:

/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

然后,我们可以进入:cd /usr/local/java/jdk1.7.0_15/jre/lib/security

默认的cacerts文件位于此处。将不受信任的证书插入其中。


1

为了安全起见,我们不应在实施中使用自签名证书。但是,在开发方面,我们经常必须使用具有自签名证书的试用环境。我试图以编程方式在代码中解决此问题,但失败了。但是,通过将证书添加到jre信任库中解决了我的问题。请找到以下步骤,

  1. 下载站点证书,

  2. 将证书(例如:cert_file.cer)复制到目录$ JAVA_HOME \ Jre \ Lib \ Security中

  3. 在Administrator中打开CMD,然后将目录更改为$ JAVA_HOME \ Jre \ Lib \ Security

  4. 使用以下命令将证书导入到信任库中,

keytool-导入-alias ca-文件cert_file.cer -keystore cacerts -storepass changeit

如果出现错误,提示无法识别keytool,请参考此内容。

类型像下面

信任此证书:[是]

  1. 现在,尝试使用Java运行代码或以编程方式访问URL。

更新资料

如果您的应用服务器是jboss,请尝试添加以下系统属性

System.setProperty("org.jboss.security.ignoreHttpsHost","true");

希望这可以帮助!


1

可部署的解决方案(Alpine Linux)

为了能够在我们的应用程序环境中解决此问题,我们准备了Linux终端命令,如下所示:

cd ~

将在主目录中生成证书文件。

apk add openssl

此命令在高山Linux中安装openssl。您可以找到其他Linux发行版的正确命令。

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

使用程序“ keytool”将生成的文件应用于JRE。

注意:请将您的DNS替换为<host-dns-ssl-belongs>

注意2:请轻轻注意-noprompt不会显示验证消息(是/否),并且-storepass changeit参数将禁用密码提示并提供所需的密码(默认为“ changeit”)。这两个属性使您可以在应用程序环境中使用这些脚本,例如构建Docker映像。

注意3如果通过Docker部署应用程序,则可以生成一次秘密文件并将其放入应用程序项目文件中。您无需一次又一次地生成它。


0

我也有这个问题。

我通过将SSL证书添加到.keystore来尝试了几乎所有方法,但是,它不适用于Java1_6_x。对我来说,如果我们开始使用Java的较新版本Java1_8_x作为JVM,它将对您有所帮助。


1
我也是。从Java 1.8.0_91到1.8.0_121的更新解决了该问题。我通过使用Apache HTTPClient获得了例外。
Devabc

我仍然有使用的OAuth2验证这个问题
Sofiane的

0

我在使用代理时遇到了Android Studio的问题。我使用的Crashlytics试图在构建过程中上载映射文件。

我将缺少的代理证书添加到位于的信任库中 /Users/[username]/Documents/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/security/cacerts

使用以下命令: keytool -import -trustcacerts -keystore cacerts -storepass [password] -noprompt -alias [alias] -file [my_certificate_location]

例如使用默认的信任库密码 keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias myproxycert -file /Users/myname/Downloads/MyProxy.crt


0

只是一个小技巧。将文件“ hudson.model.UpdateCenter.xml”中的URL从https更新为http

<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>http://updates.jenkins.io/update-center.json</url>
  </site>
</sites>

0

我想了解一下,因为我有一个QEMU环境,必须在Java环境中下载文件。事实证明/etc/ssl/certs/java/cacerts,QEMU中的确存在问题,因为它与/etc/ssl/certs/java/cacerts与主机环境。主机环境位于公司代理的后面,因此java cacerts是自定义版本。

如果使用的是QEMU环境,请确保主机系统可以首先访问文件。例如,您可以先在主机上尝试使用此脚本来查看。如果脚本在主机上运行正常,但在QEMU中运行不正常,则您遇到的问题与我相同。

为了解决此问题,我必须对QEMU中的原始文件进行备份,然后将其在主机环境中复制到QEMU chroot监狱中,然后Java才能正常在QEMU中下载文件。

更好的解决方案是将其安装/etc到QEMU环境中。但是我不确定其他文件是否会在此过程中受到影响。因此,我决定使用这种难看但简单的解决方法。


0

这似乎是记录臭名昭著的PKIX错误消息的另一个可能原因的好地方。花了太长时间查看密钥库和信任库的内容以及各种Java安装配置后,我才意识到我的问题归结于...错字。

拼写错误意味着我也将密钥库用作信任库。由于我的公司Root CA在密钥库中并未定义为独立证书,而仅是证书链的一部分,并且在其他任何地方(即cacerts)均未定义,因此我一直收到PKIX错误。

发布失败(这是prod config,在其他地方还可以),并且花了两天的时间挠头,我终于看到了错字,现在一切都很好。

希望这对某人有帮助。


-1

将此添加到您的代码:

TrustManager[] trustAllCerts = new TrustManager[]{
           new X509TrustManager() {
               @Override
               public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                   return new X509Certificate[0];
               }

               @Override
               public void checkClientTrusted(
                       java.security.cert.X509Certificate[] certs, String authType) {
               }

               @Override
               public void checkServerTrusted(
                       java.security.cert.X509Certificate[] certs, String authType) {
               }
           }
       };

       try {
           SSLContext sc = SSLContext.getInstance("SSL");
           sc.init(null, trustAllCerts, new java.security.SecureRandom());
           HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
       } catch (GeneralSecurityException e) {
       }

1
在此网站上,通常仅提供代码答案。您能否编辑您的答案以包含一些对代码的注释或解释?解释应回答以下问题:它是做什么的?它是如何做到的?去哪儿了?它如何解决OP的问题?
mypetlion,

1
添加到您的代码不添加到您的代码。以这种方式创建SSLContext会删除所有验证您要连接的服务器身份的安全检查。丢失钥匙的问题的答案是不要从您拥有的所有物品上删除所有锁。
Andrew Henle
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.