Инициализация 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
- это просто псевдоним для TLSv1
(и SSL
и 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.