Что такое TLS и для чего он нужен
Что проверяют
Знаете ли вы, что TLS даёт на уровне протокола, и умеете ли настроить его в Java-приложении. Бэкенд-разработчику почти наверняка зададут практический вопрос: что делать с PKIX path building failed или как включить mTLS между сервисами.
Как отвечать
TLS это протокол поверх TCP, который обеспечивает конфиденциальность, целостность и аутентификацию сторон. Актуальные версии 1.2 и 1.3. В TLS 1.3 полное рукопожатие занимает один круг вместо двух, остались только шифры AEAD и обмен ключами с прямой секретностью, а RSA-обмен и режим CBC убраны.
Рукопожатие коротко: клиент предлагает версии и шифры, сервер присылает сертификат, стороны через ECDHE получают общий секрет, дальше трафик идёт симметричным шифром.
Java-часть, ради которой вопрос и задают:
- JSSE: реализация TLS в JDK, центральный класс
SSLContext, к немуKeyManagerиTrustManager; - keystore и truststore: в первом свой ключ и сертификат, во втором доверенные центры. Системный truststore лежит в
$JAVA_HOME/lib/security/cacerts, с Java 9 формат хранилищ по умолчанию PKCS12, управляются черезkeytool; - версии: TLS 1.3 есть с Java 11, TLS 1.0 и 1.1 отключены по умолчанию с 2021 года в обновлениях 8, 11 и во всех новых версиях;
- Spring Boot:
server.ssl.*для сервера, а с версии 3.1 SSL bundles (spring.ssl.bundle.*) для единой настройки сервера и клиентов; - mTLS: сервер тоже проверяет сертификат клиента,
server.ssl.client-auth=need; - отладка:
-Djavax.net.debug=ssl:handshakeпоказывает, на каком шаге упало рукопожатие.
Где спотыкаются
Лечат PKIX path building failed доверяющим всем TrustManager или отключением проверки имени хоста. Это молча открывает дорогу MITM. Правильно добавить нужный корневой или промежуточный сертификат в truststore приложения.
Путают keystore и truststore и кладут сертификат партнёра не туда, а потом ищут ошибку в коде.
Называют SSL и TLS одним и тем же без оговорки. SSL давно запрещён, а в SSLContext.getInstance("SSL") это лишь историческое имя, реальные версии определяет конфигурация.