Инициализация SSLContext
Я смотрю справочное руководство JSSE
, мне нужно получить экземпляр SSLContext
, чтобы создать SSLEngine
, поэтому я могу использовать его с Netty
для обеспечения безопасности.
Чтобы получить экземпляр SSLContext
, я использую SSLContext.getInstance()
. Я вижу, что метод переопределяется несколько раз, поэтому я могу выбрать используемого протокола и поставщика безопасности.
Здесь я вижу список алгоритмов, которые можно использовать. Какой алгоритм я должен использовать для обеспечения безопасной связи?
- Использование makecert для разработки SSL
- Как я могу использовать разные сертификаты для определенных соединений?
- Использование CERT Tapioca на VM
- Динамические изображения, переданные через HTTPS, отображают сломанное изображение в слове при открытии HTTP-документа
- Поддержка Android SSL - SNI
Кроме того, поскольку можно указать поставщика безопасности для использования, какой провайдер должен использовать?
благодаря
- «Проверьте ошибку: num = 20» при подключении к gateway.sandbox.push.apple.com
- SSLHandshakeException: нет альтернативных имен объектов
- Как игнорировать создание пути PKIX не удалось: sun.security.provider.certpath.SunCertPathBuilderException?
- Https Connection Android
- Не удалось добавить сертификат SSL при привязке к порту
- как добавить терминологическое имя объекта в ssl certs?
- Как исправить, если сайт всегда перенаправляется на другой фишинг-сайт?
- pip всегда терпит неудачу ssl проверка
Как вы можете видеть в документации по стандартным именам , все записи (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. Рассматривая исходный код для Это изменяется в Java 8 в сочетании с новым системным свойством Опять же, рассматривая исходный код для Тем не менее, протокол Чтобы включить определенные клики SunJSSE на клиенте, укажите их в списке, разделенном запятыми, в кавычках; все остальные поддерживаемые протоколы затем отключены на клиенте. Например, если значением этого свойства является «TLSv1, TLSv1.1», то на клиенте будут установлены параметры протокола по умолчанию для TLSv1 и TLSv1.1, тогда как SSLv3, TLSv1.2 и SSLv2Hello отключены на клиент. Если это свойство пустое, все протоколы по умолчанию включены как на стороне клиента, так и на стороне сервера. Конечно, в последних версиях Oracle JRE 8 SSL также полностью отключен по умолчанию (поэтому удаляется из этих списков). Обратите внимание, что в обоих случаях (JRE 7 и 8)
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 по умолчанию. 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 :
SSLContext
вы получаете по умолчанию через SSLContext.getDefault()
из коробки, более или менее эквивалентен SSLContext
полученному с протоколом TLS
и инициализирован параметрами доверия по умолчанию и так далее ,
По умолчанию для протокола нет значения, поэтому я бы использовал последнюю версию, поддерживаемую вашим JDK, которая является либо TLSv1, TLSv1.1, либо TLSv1.2: см., Что работает, или посмотрите на getSupportedProtocols()
. Поставщик безопасности по умолчанию используется, избегая всех API-интерфейсов, где вы его указываете, или, например, KeyStore.getDefaultType()
.
И когда вы придете, чтобы получить SSLEngines, убедитесь, что вы используете метод, который принимает имя хоста и порт. В противном случае вы не получите сеанса обмена сеансами SSL.