Принудительный протокол в клиенте с использованием httpClient 4.3.6 на Java 6
По какой-то причине тестирования мне нужно заставить SSLv3 использоваться Клиентом. SSLv3 - это принятый протокол на сервере. Попытка принудительного использования с использованием SSLContextBuilder.useProtocol("SSLv3"), как показано ниже:
SSLContextBuilder инициируется, как показано ниже:
SSLContextBuilder builder = SSLContexts.custom();
SSLContext sslContext = builder.useProtocol("SSLv3").build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, new X509HostnameVerifier() {
@Override
public void verify(String host, SSLSocket ssl) throws IOException {
}
....
....);
return sslsf;
}
Но результат в журнале показывает, что рукопожатие всегда делают в TLSv1:
....
....
Allow legacy hello messages: true
Is initial handshake: true
Is secure renegotiation: false
%% No cached client session
*** ClientHello, TLSv1
RandomCookie:
GMT: 1503650935
bytes = {
255,
....
....
Насколько я понимаю, клиент должен запросить протокол, который определен, принимает ли сервер или нет. В этом случае я ожидаю увидеть, что клиент должен запрашивать использование SSLv3, а не TLSv1.
1 ответ
Решение
Это заставит HC 4.3 использовать только SSLv3
SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(
SSLContext.getDefault(), new String[] {"SSLv3"}, null, SSLConnectionSocketFactory.STRICT_HOSTNAME_VERIFIER);
CloseableHttpClient httpClient = HttpClients.custom()
.setSSLSocketFactory(sslSocketFactory)
.build();