仅使用 Apache HttpClient 跳过主机名验证

use*_*273 4 java ssl apache-httpclient-4.x

我需要在不更改信任管理器的情况下跳过 httpclient 4.2.1 的主机名验证。我是这样存档的:

    httpClient = new DefaultHttpClient(a, b);
    SSLSocketFactory socketFactory = (SSLSocketFactory) httpClient.getConnectionManager().getSchemeRegistry().get("https").getSchemeSocketFactory();
    socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
Run Code Online (Sandbox Code Playgroud)

...但我使用的 setHostnameVerifier 方法已被弃用。如何使用未弃用的方法实现相同的目标?

Ste*_*ich 5

不要这样做!!!

正如在/sf/answers/2068298011/ 上向您解释的那样,这已经是一个非常糟糕的主意,并且有效地禁用了所有验证,因为攻击者可以使用其他主机的任何证书来挂载 man-in-中间攻击。

你再次问同样的问题并不会变得更安全。


eMi*_*ace 5

正如之前的人所说,只有在有充分理由时才应该这样做。我也有封闭的测试环境,我只在绝对需要时禁用主机名验证。它唯一被禁用的地方是在运行测试的应用程序中,永远不会在将部署到面向用户的服务器的应用程序中。

这可以通过快速实现您自己的 HostnameVerifier 来完成。

SSLContext sslContext = SSLContext.getDefault();
HostnameVerifier allowAll = new HostnameVerifier() {
    @Override
    public boolean verify(String hostName, SSLSession session) {
        return true;
    }
};
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
    .register("https", new SSLConnectionSocketFactory(sslContext, allowAll))
    .build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
Run Code Online (Sandbox Code Playgroud)