【发布时间】:2015-04-09 19:03:44
【问题描述】:
我有一个服务器女巫正在运行一个 https 网络服务器。当我使用浏览器输入它时,我收到域不匹配的错误(因为我使用服务器的 IP)并且证书不受信任。 现在我需要使用 apache httpclient 4.2.1 向该服务器发送 GET 请求。我在网上找到了一段对我有帮助的代码:
httpClient = new DefaultHttpClient(a, b);
SSLSocketFactory sslSocketFactory = new SSLSocketFactory(
new TrustStrategy() {
@Override
public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
return true;
}
}, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
httpClient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", 443, sslSocketFactory));
因为我不完全理解这段代码,所以我想问一些问题。
1) 我是否正确理解 SSlSocetFactory 的第一个参数是绕过我的证书问题的“不可信”部分?它基本上只是返回每个证书都是可信的?
2)可能需要第二个参数,因为我的证书主机名与 URL 不匹配?
3) 这个 SchemeRegistry 和 Scheme 到底是什么?我正在制作一个带有参数“https”、443 和我之前创建的 SSLSocketFactory 的新方案。我知道这个方案适用于 https 连接,它使用我在 sslSocketFactory 中定义的规则,但端口是什么?这是否适用于仅在端口 443 或其他端口上的 https 连接?如果我的端口不同,我应该在那里输入不同的端口吗?
4) 最重要的问题:如果我要使用受信任的证书,那么我怎么能只跳过主机名验证而不更改信任策略?
【问题讨论】:
-
你用的是哪个浏览器?