信任不信任的证书并跳过主机名验证
Trust not trusted certificates and skip hostname verification
我有一个服务器 是 运行 一个 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 的第一个参数是绕过我的证书问题的 "not trusted" 部分?基本上只是 returns 每个证书都是可信的?
2) 可能需要第二个参数,因为我的证书主机名不符合 URL?
3)这个SchemeRegistry和Scheme到底是什么?我正在制作一个带有参数 "https"、443 和我之前创建的 SSLSocketFactory 的新方案。我知道这个方案是针对 https 连接的,它使用我在 sslSocketFactory 中定义的规则,但是端口是做什么用的?这是否适用于仅在端口 443 或其他端口上的 https 连接?如果我的端口不同,我应该输入不同的端口吗?
4) 最重要的问题:如果我要使用受信任的证书,那么我怎么能只跳过主机名验证而不更改信任策略?
1) Do i understand correctly that the first parameter of SSlSocetFactory is to bypass the "not trusted" part of my certificate problem? It basically just returns that every certificate is trusted?
是的。这是一个非常糟糕的主意。
2) The second parameter is probably needed because my cerificate hostname does not mach the URL?
是的。这也是一个非常糟糕的主意。
... but whats the port for
这是协议的默认端口,也就是说,如果您提供 https://host/
URL 而不是 https://host:port/
,它就会知道该端口将为 443。
4) The most important question: if i were to use a trusted certificate then how could i only skip hostname verification and not change the trust strategy?
禁用验证的这一重要部分将是一个非常糟糕的主意。实际上,您将允许使用由受信任的 CA 签名的 any 证书,而不是您自己的证书。由于拥有某个域并为其获取受信任的证书很容易,因此您可能会容易受到中间人攻击。
如果确实无法使用正确的证书(为什么您仍然使用 IP 而不是名称?)那么您应该使用证书或 public 密钥固定来仅信任此证书。请参阅 OWASP 了解更多信息,包括示例代码。
我有一个服务器 是 运行 一个 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 的第一个参数是绕过我的证书问题的 "not trusted" 部分?基本上只是 returns 每个证书都是可信的?
2) 可能需要第二个参数,因为我的证书主机名不符合 URL?
3)这个SchemeRegistry和Scheme到底是什么?我正在制作一个带有参数 "https"、443 和我之前创建的 SSLSocketFactory 的新方案。我知道这个方案是针对 https 连接的,它使用我在 sslSocketFactory 中定义的规则,但是端口是做什么用的?这是否适用于仅在端口 443 或其他端口上的 https 连接?如果我的端口不同,我应该输入不同的端口吗?
4) 最重要的问题:如果我要使用受信任的证书,那么我怎么能只跳过主机名验证而不更改信任策略?
1) Do i understand correctly that the first parameter of SSlSocetFactory is to bypass the "not trusted" part of my certificate problem? It basically just returns that every certificate is trusted?
是的。这是一个非常糟糕的主意。
2) The second parameter is probably needed because my cerificate hostname does not mach the URL?
是的。这也是一个非常糟糕的主意。
... but whats the port for
这是协议的默认端口,也就是说,如果您提供 https://host/
URL 而不是 https://host:port/
,它就会知道该端口将为 443。
4) The most important question: if i were to use a trusted certificate then how could i only skip hostname verification and not change the trust strategy?
禁用验证的这一重要部分将是一个非常糟糕的主意。实际上,您将允许使用由受信任的 CA 签名的 any 证书,而不是您自己的证书。由于拥有某个域并为其获取受信任的证书很容易,因此您可能会容易受到中间人攻击。
如果确实无法使用正确的证书(为什么您仍然使用 IP 而不是名称?)那么您应该使用证书或 public 密钥固定来仅信任此证书。请参阅 OWASP 了解更多信息,包括示例代码。