Рубрики
Без рубрики

Включение TLS v1.2 в Java 7

Узнайте, как обновить протокол сокета SSL до TLS 1.2 в Java 7.

Автор оригинала: baeldung.

1. Обзор

Когда дело доходит до SSL-соединений, мы должны использовать TLSv1.2. Действительно, это протокол SSL по умолчанию для Java 8.

И хотя Java 7 поддерживает TLSv1.2, по умолчанию используется TLS v1.0, который в наши дни слишком слаб.

В этом руководстве мы обсудим различные варианты настройки Java 7 для использования TLSv1.2.

2. Использование аргументов виртуальной машины Java

Если мы используем Java 1.7.0_95 или более позднюю версию, мы можем добавить свойство jdk.tls.client.protocols в качестве аргумента командной строки java для поддержки TLSv1.2:

java -Djdk.tls.client.protocols=TLSv1.2 

Но Java 1.7.0_95 доступна только тем клиентам, которые приобрели поддержку у Oracle . Итак, мы рассмотрим другие варианты ниже, чтобы включить TLSv1.2 на Java 7.

3. Использование SSLSocket

В этом первом примере мы включим TLSv1.2 с помощью SSLSocketFactory .

Во-первых, мы можем создать объект по умолчанию SSLSocketFactory , вызвав метод SSLSocketFactory# getDefault factory.

Затем мы просто передаем наш хост и порт в SSLSocket# createSocket :

SSLSocketFactory socketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslSocket = (SSLSocket) socketFactory.createSocket(hosturl, port);

По умолчанию SSLSocket , созданный выше, не имеет связанных с ним протоколов SSL. Мы можем связать протоколы SSL с нашим SSLSocket несколькими способами.

В первом подходе мы можем передать массив поддерживаемых протоколов SSL в метод setEnabledProtocols на нашем SSLSocket экземпляре :

sslSocket.setEnabledProtocols(new String[] {"TLSv1.2"});

В качестве альтернативы мы можем использовать Параметры SSL , используя тот же массив:

SSLParameters params = new SSLParameters();
params.setProtocols(new String[] {"TLSv1.2"});
sslSocket.setSSLParameters(params);

4. Использование SSLContext

Установка SSLSocket напрямую изменяет только одно соединение. Мы можем использовать SSLContext , чтобы изменить способ создания SSLSocketFactory.

Итак, вместо использования SSLSocketFactory#getInstance , давайте сделаем SSLContext#getInstance, предоставив ему “ TLSv1.2 ” в качестве параметра. Мы можем просто получить наш SSLSocketFactory из этого сейчас:

SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null, null, new SecureRandom());
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
SSLSocket socket = (SSLSocket) socketFactory.createSocket(url, port);

В качестве краткого примечания всегда помните, что при работе с SSL следует использовать SecureRandom .

5. Использование HttpsURLConnection

Конечно, мы не всегда создаем сокеты напрямую. Часто мы находимся на уровне прикладного протокола.

Итак, наконец, давайте посмотрим, как включить TLSv1.2 на HttpsURLConnection .

Во-первых, нам понадобится экземпляр URL . Давайте представим, что мы подключаемся к https://example.org :

URL url = new URL("https://" + hosturl + ":" + port);

Теперь мы можем настроить наш SSLContext , как и раньше:

SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); 
sslContext.init(null, null, new SecureRandom());

Затем наши последние шаги заключаются в том, чтобы создать соединение и снабдить его SSLSocketFactory :

HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setSSLSocketFactory(sslContext.getSocketFactory());

6. Заключение

В этой краткой статье мы показали несколько способов включения TLSv1.2 на Java 7.

Примеры кода, используемые в этой статье, доступны на GitHub .