![](/img/trans.png)
[英]How can I use Jetty to serve servlets without worrying about War file layouts?
[英]In java how can I connect to https sites without worrying about security certificates
当我尝试连接到 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 在这个项目中的安全优势,我只是希望能够连接到 wenbsite。
似乎您已经被警告不要使用这种方法,所以我会坚持回答您的问题。 我能够在我的机器上重现这个问题,但我不知道为什么:我的浏览器毫无问题地接受了该站点的证书。
我曾尝试扩展您的代码以使其工作,但很快发现自己弄乱了SSLContext
、各种加密提供程序和服务提供程序接口。 我没有设法完成这种方法,实际上也不建议采用这种方法,因为它会更改 JVM 的全局安全设置,并且可能会产生不可预测的后果,具体取决于它在做什么。
相反,我建议您查看Apache HttpComponents 库,它允许对连接的安全设置进行更细粒度的控制。
以下将禁用创建的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 库中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.