gpt4 book ai didi

java - 在 java 中,如何连接到 https 站点而不用担心安全证书

转载 作者:太空宇宙 更新时间:2023-11-03 13:23:19 26 4
gpt4 key购买 nike

当我尝试连接到 https 网站时,如下所示:

StringBuilder sb = new StringBuilder();
URL oracle = new URL("https://company.com");
URLConnection yc = oracle.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
sb.append(inputLine);
in.close();
return sb.toString();

我明白了

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292)
at sun.security.validator.Validator.validate(Validator.java:260)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1491)

如果我改用 http://company.com 它可以工作,但我想使用 https,因为这是他们说要使用的,我认为不安全的可能会被删除.

但是,当我查看有关此的类似答案时,它谈到从我的浏览器 ectera 复制证书。我需要一个解决方案,该解决方案适用于在任何计算机上运行代码的任何人,而无需执行任何特殊操作。

我不关心 SSL 对这个项目的安全优势,我只是希望能够连接到网站。

最佳答案

您似乎已经被警告不要使用这种方法,所以我会坚持回答您的问题。我能够在我的机器上重现该问题,但我不知道为什么:我的浏览器可以顺利接受该站点的证书。

我曾尝试扩展您的代码以使其正常工作,但很快发现自己弄乱了 SSLContext、各种加密提供程序和服务提供程序接口(interface)。我没有设法完成这种方法,实际上也不建议采用这种方法,因为它会更改 JVM 的全局安全设置,并且可能会产生不可预测的后果,具体取决于它正在做什么。

相反,我建议您查看 Apache HttpComponents library ,它允许对连接的安全设置进行更细粒度的控制。

以下将为创建的 HttpClient 实例禁用所有证书验证:

TrustStrategy veryNaive = new TrustStrategy() {
@Override
public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
return true;
}
};

SSLContext sslcontext = SSLContexts.custom()
.loadTrustMaterial(veryNaive)
.build();

CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(new SSLConnectionSocketFactory(sslcontext))
.build();

try {
HttpGet httpget = new HttpGet("https://company.com");

try (CloseableHttpResponse response = httpclient.execute(httpget);) {
HttpEntity entity = response.getEntity();
System.out.println(EntityUtils.toString(entity));
EntityUtils.consume(entity);
}
} finally {
httpclient.close();
}

SSLContext 更改为 SSLContexts.createSystemDefault(); 会重新引入问题,只是为了证明它也存在于 Apache 库中。

关于java - 在 java 中,如何连接到 https 站点而不用担心安全证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42229760/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com