1. Обзор
Когда дело доходит до соединений SSL, мы должны использовать TLSv1.2. Действительно, это протокол SSL по умолчанию для Java 8.
И хотя Java 7 поддерживает TLSv1.2, по умолчанию используется TLS v1.0, который в наши дни слишком слаб.
В этом руководстве мы обсудим различные варианты настройки Java 7 для использования TLSv1.2.
2. Использование аргументов Java VM
Если мы используем Java 1.7.0_95 или более позднюю версию, мы можем добавить свойство jdk.tls.client.protocols
в качестве аргумента командной строки java для поддержки TLSv1.2:
java -Djdk.tls.client.protocols=TLSv1.2 <Main class or the Jar file to run>
Но Java 1.7.0_95 доступна только клиентам, купившим поддержку у Oracle . Итак, ниже мы рассмотрим другие варианты включения TLSv1.2 на Java 7.
3. Использование SSLSocket
В этом первом примере мы включим TLSv1.2 с помощью SSLSocketFactory
.
Во- первых, мы можем создать объект SSLSocketFactory
по умолчанию, вызвав фабричный метод SSLSocketFactory#
getDefault .
Затем мы просто передаем наш хост и порт в 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"});
В качестве альтернативы мы можем использовать SSLParameters
, используя тот же массив:
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);
Небольшое примечание: всегда помните об использовании SecureRandom
при работе с SSL.
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 .