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 方法已被弃用。如何使用未弃用的方法实现相同的目标?
不要这样做!!!
正如在/sf/answers/2068298011/ 上向您解释的那样,这已经是一个非常糟糕的主意,并且有效地禁用了所有验证,因为攻击者可以使用其他主机的任何证书来挂载 man-in-中间攻击。
你再次问同样的问题并不会变得更安全。
正如之前的人所说,只有在有充分理由时才应该这样做。我也有封闭的测试环境,我只在绝对需要时禁用主机名验证。它唯一被禁用的地方是在运行测试的应用程序中,永远不会在将部署到面向用户的服务器的应用程序中。
这可以通过快速实现您自己的 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)
| 归档时间: |
|
| 查看次数: |
10583 次 |
| 最近记录: |