У меня есть следующий код для инициализации HTTP-клиента Apache (версия 4.5.6).
builder = new SSLContextBuilder();
builder.loadTrustMaterial(null, new TrustStrategy() {
@Override
public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
return true;
}
});
sslsf = new SSLConnectionSocketFactory(builder.build(), new String[]{"SSLv2Hello", "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2"}, null, NoopHostnameVerifier.INSTANCE);
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register(HTTP, new PlainConnectionSocketFactory())
.register(HTTPS, sslsf)
.build();
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
connectionManager.setMaxTotal(MAX_CONNECTIONS);
connectionManager.setDefaultMaxPerRoute(MAX_PER_ROUTE);
connectionManager.setDefaultSocketConfig(socketConfig);
connectionManager.setDefaultConnectionConfig(connectionConfig);
LaxRedirectStrategy redirectStrategy = new LaxRedirectStrategy();
DefaultHttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(MAX_RETRY_COUNT, false);
httpClient = HttpClients.custom()
.setConnectionManager(connectionManager)
.setRedirectStrategy(redirectStrategy)
.setRetryHandler(retryHandler)
.setDefaultRequestConfig(requestConfig)
.build();
Когда я использую этот клиент для отправки запроса на сервер, он всегда выдает исключение сокета (сброс соединения). После того, как я изменил
sslsf = new SSLConnectionSocketFactory(builder.build(), new String[]{"SSLv2Hello", "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2"}, null, NoopHostnameVerifier.INSTANCE);
на
sslsf = new SSLConnectionSocketFactory(builder.build(), new String[]{"TLSv1", "TLSv1.1", "TLSv1.2"}, null, NoopHostnameVerifier.INSTANCE);
, он работает хорошо. В чем тут подвох? Почему определение двух БОЛЕЕ протоколов (SSLv2 и SSLv3) вызовет проблему? Каков внутренний механизм этого параметра (поддерживаемые протоколы)? Благодаря.