在java中,如何连接到https站点而不用担心安全证书
当我尝试连接到https网站时,如下所示:在java中,如何连接到https站点而不用担心安全证书,java,ssl,https,urlconnection,Java,Ssl,Https,Urlconnection,当我尝试连接到https网站时,如下所示: StringBuilder sb = new StringBuilder(); URL oracle = new URL("https://company.com"); URLConnection yc = oracle.openConnection(); BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStr
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();
我明白了
如果我使用http://company.com
相反,它可以工作,但我想使用https,因为他们说要使用https,我认为不安全的可能会被删除
然而,当我看到类似的答案时,它谈到了从我的浏览器ectera复制证书。我需要一个解决方案,将为任何人在任何计算机上运行的代码,而不必做任何特殊的工作
我不关心SSL在这个项目中的安全优势,我只想能够连接到wenbsite 看来你已经被警告不要这样做了,所以我会继续回答你的问题。我能够在我的机器上重现这个问题,尽管我不知道为什么:我的浏览器顺利地接受了网站的证书 我曾尝试扩展您的代码以使其正常工作,但很快发现自己正在处理
SSLContext
、各种加密提供程序和服务提供程序接口。我没有完成这种方法,也不建议这样做,因为它会更改JVM的全局安全设置,并且可能会产生不可预测的后果,具体取决于它在做什么
相反,我建议您看看,它允许对连接的安全设置进行更细粒度的控制
以下操作将禁用所创建的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库也存在这个问题。通过“不担心”SSL,你是说你不关心你的程序被中间人攻击愚弄了,尽管这个站点显然关心中间人攻击(如果他们说使用https版本,并且http版本可能在某个时候被删除)。首先,如果网站不提供HTTP,那么你无论如何都会失败。其次,你的请求应该可以工作,因为运行时带有默认值。可能该网站上的证书有问题,无法验证。@t.J.Crowder看,如果他们没有提供https版本,你不会告诉我不要使用该网站,没有任何关键/敏感的问题因此,与其批评我不关心thsi环境中的ssl,我该如何解决问题issue@Alfabravo我不明白你的意思,他们目前确实支持http。我的请求不起作用,尽管其他一切都起作用,但我如何修复它,使其适用于我和任何计算机上的其他用户using@PaulTayl或者:这就是我上面提到的要点:如果网站期望并且——你建议过——可能很快会要求你使用https访问它,他们大概有这样的理由。如果他们没有,他们可以使用http,你就不会有这个问题。如果你问“没有钥匙我怎么能打开这扇锁着的门”,有人说“好吧,也许在没有钥匙的情况下试图通过它不是一个好主意”,你说“但是如果它没有被锁定,你不会告诉我”没有任何意义。无论如何,我让你去做,祝你好运。非常感谢你的解决方案,尽管我使用的是HttpComponents 4.5.3和SSLContexts.custom()。loadTrustMaterial())似乎需要信任库而不是信任策略?@PaulTaylor:检查您使用的是正确的。库似乎包含两个SSLContexts
类,其中一个已弃用。正确的是org.apache.http.ssl.SSLContexts
()。谢谢你。我现在唯一的问题是,有时我查找的url不存在,而你的代码不能很好地处理这一问题,因为它返回一些表示未找到的json,而不是什么也不返回/给出一个错误代码,这与我的http(不安全)情况不同。现在修复了,添加了int statusCode response.getStatusLine().getStatusCode();if(statusCode!=HttpURLConnection.HTTP_OK)return“”;极好!是关于为您提供HttpResponse
类的javadoc,其中包含您需要的内容。()
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();
}