Инициализация SSLContext

Я смотрю справочное руководство JSSE , мне нужно получить экземпляр SSLContext , чтобы создать SSLEngine , поэтому я могу использовать его с Netty для обеспечения безопасности.

Чтобы получить экземпляр SSLContext , я использую SSLContext.getInstance() . Я вижу, что метод переопределяется несколько раз, поэтому я могу выбрать используемого протокола и поставщика безопасности.

Здесь я вижу список алгоритмов, которые можно использовать. Какой алгоритм я должен использовать для обеспечения безопасной связи?

Кроме того, поскольку можно указать поставщика безопасности для использования, какой провайдер должен использовать?

благодаря

Как вы можете видеть в документации по стандартным именам , все записи (SSLv3, TLSv1.0, TLSv1.1, …) говорят, что они могут поддерживать другие версии.

На практике, в Oracle JDK (и OpenJDK), они все делают. Если вы посмотрите на исходный код , class TLS10Context – это то, что используется для TLS, SSL, SSLv3 и TLS10, TLS11Context используется для TLSv1.1 и TLS12Context для TLSv1.2. Все поддерживающие все версии SSL / TLS, это то, что включено по умолчанию, меняется.

Это может отличаться от другого поставщика или поставщика JRE. Конечно, вы должны выбрать тот, который, по крайней мере, будет поддерживать версию протокола, которую вы хотите использовать.

Обратите внимание, что используемый протокол определяется позже с использованием SSLSocket.setEnabledProtocols(...) или его эквивалента SSLEngine .

Как правило, используйте наивысший номер версии (SSLv3


Какие протоколы включены по умолчанию, зависит от конкретной версии Oracle JRE.

Рассматривая исходный код для sun.security.ssl.SunJSSE в OpenJDK 7u40-b43 , TLS является просто псевдонимом для TLSv1 (а также SSL и SSLv3 ) с точки зрения протоколов SSLContext . Рассматривая различные реализации SSLContextImpl (которые являются внутренними classами самого SSLContextImpl ):

  • Все поддерживают все протоколы.
  • По умолчанию все протоколы включены на стороне сервера.
  • протоколы на стороне клиента, включенные по умолчанию, различаются:
    • TLS10Context (используется для протокола SSL , SSLv3 , TLS , TLSv1 ) по умолчанию на стороне клиента SSLV3 до TLSv1.0.
    • TLS11Context (используемый для протокола TLSv1.1 ) также включает TLSv1.1 по умолчанию.
    • TLS12Context (используется для протокола TLSv1.2 ) также позволяет TLSv1.2 по умолчанию.
  • Если включен FIPS, SSL не поддерживается (по умолчанию он не включен).

Это изменяется в Java 8 в сочетании с новым системным свойством jdk.tls.client.protocols .

Опять же, рассматривая исходный код для sun.security.ssl.SunJSSE в OpenJDK 8u40-b25 , протоколы SSLContext TLSv1 , TLSv1.1 и TLSv1.2 также используют TLS10Context , TLS11Context и TLS12Context , которые следуют той же логике, что и в Java 7.

Тем не менее, протокол TLS больше не применяется ни к одному из них. Скорее, он использует TLSContext который полагается на значения в свойствах jdk.tls.client.protocols . Из справочника JSSE :

Чтобы включить определенные клики SunJSSE на клиенте, укажите их в списке, разделенном запятыми, в кавычках; все остальные поддерживаемые протоколы затем отключены на клиенте. Например, если значением этого свойства является «TLSv1, TLSv1.1», то на клиенте будут установлены параметры протокола по умолчанию для TLSv1 и TLSv1.1, тогда как SSLv3, TLSv1.2 и SSLv2Hello отключены на клиент.

Если это свойство пустое, все протоколы по умолчанию включены как на стороне клиента, так и на стороне сервера.

Конечно, в последних версиях Oracle JRE 8 SSL также полностью отключен по умолчанию (поэтому удаляется из этих списков).

Обратите внимание, что в обоих случаях (JRE 7 и 8) SSLContext вы получаете по умолчанию через SSLContext.getDefault() из коробки, более или менее эквивалентен SSLContext полученному с протоколом TLS и инициализирован параметрами доверия по умолчанию и так далее ,

По умолчанию для протокола нет значения, поэтому я бы использовал последнюю версию, поддерживаемую вашим JDK, которая является либо TLSv1, TLSv1.1, либо TLSv1.2: см., Что работает, или посмотрите на getSupportedProtocols() . Поставщик безопасности по умолчанию используется, избегая всех API-интерфейсов, где вы его указываете, или, например, KeyStore.getDefaultType() .

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

  • Ошибка «Нет равных сертификатов» в Android 2.3, но НЕ в 4
  • Сколько накладных расходов накладывает SSL?
  • JavaMail IMAP через SSL довольно медленно - Массовая выборка нескольких сообщений
  • Как я могу создать хранилище ключей из существующих сертификатов (abc.crt) и файлов abc.key?
  • Android-шлюз, подписанный якорем HTTPS, для пути сертификации не найден
  • Какие Cipher Suites включить для SSL Socket?
  • Heroku SSL в корневом домене
  • Самостоятельный SSL-сертификат Tomcat Server / Client
  • Что такое SSL-сертификат superfish и откуда он
  • «Java недоступен» в Firefox 32 бита
  • Как добавить сертификат SSL в AWS EC2 с помощью новой службы AWS Certificate Manager
  • Давайте будем гением компьютера.