【问题标题】:Trust not trusted certificates and skip hostname verification信任不受信任的证书并跳过主机名验证
【发布时间】: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) 最重要的问题:如果我要使用受信任的证书,那么我怎么能只跳过主机名验证而不更改信任策略?

【问题讨论】:

  • 你用的是哪个浏览器?

标签: java ssl


【解决方案1】:

1) 我是否正确理解 SSlSocetFactory 的第一个参数是绕过我的证书问题的“不可信”部分?它基本上只是返回每个证书都是可信的?

是的。这是一个非常糟糕的主意。

2)可能需要第二个参数,因为我的证书主机名与 URL 不匹配?

是的。这也是一个非常糟糕的主意。

...但是端口是什么

这是协议的默认端口,即如果您提供https://host/ URL 而不是https://host:port/,则它知道端口将为 443。

4) 最重要的问题:如果我要使用受信任的证书,那么我怎么能只跳过主机名验证而不更改信任策略?

禁用验证的这一重要部分是一个非常糟糕的主意。实际上,您将允许使用由受信任的 CA 签名的 任何 证书来代替您自己的证书。由于拥有某个域并为其获得受信任的证书很容易,因此您很容易受到中间人攻击。

如果真的不可能使用正确的证书(为什么还要使用 IP 而不是名称?),那么您应该使用证书或公钥固定来仅信任此证书。有关包括示例代码在内的更多信息,请参阅OWASP。

【讨论】:

    猜你喜欢
    • 2012-07-05
    • 2019-02-26
    • 1970-01-01
    • 2020-04-13
    • 2023-03-26
    • 2018-04-16
    • 2019-05-20
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多