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

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

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

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

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

спасибо

2 ответов


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

на практике, в Oracle JDK (и OpenJDK), все они делают. Если вы посмотрите на исходный код на 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 - это просто псевдоним для TLSv1SSL и SSLv3), С точки зрения SSLContext протоколов. Глядя на различные реализации SSLContextImpl (которые являются внутренними классами 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 и инициализируется с параметрами truststore по умолчанию и так далее.


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

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