Зачем определять больше поддерживаемых протоколов в Apache HttpClient SSLConnectionSocketFactory получает исключение сброса соединения? - PullRequest
0 голосов
/ 31 октября 2019

У меня есть следующий код для инициализации 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) вызовет проблему? Каков внутренний механизм этого параметра (поддерживаемые протоколы)? Благодаря.

...