Gymterview
middle

Как работает TLS/SSL и что такое цепочка доверия сертификатов?

TLS (Transport Layer Security) — криптографический протокол, обеспечивающий конфиденциальность и целостность данных при передаче по сети. SSL — устаревший предшественник TLS. В production используется TLS 1.2 и TLS 1.3.

Процесс TLS Handshake (TLS 1.2)

Пример
Клиент                                          Сервер
   │──── ClientHello (версии TLS, cipher suites) ──>│
   │<─── ServerHello (выбранный cipher suite) ──────│
   │<─── Certificate (сертификат сервера) ──────────│
   │<─── ServerKeyExchange (параметры DH) ──────────│
   │<─── ServerHelloDone ──────────────────────────│
   │──── ClientKeyExchange (предмастер-секрет) ───>│
   │──── ChangeCipherSpec ─────────────────────────>│
   │──── Finished (зашифровано) ───────────────────>│
   │<─── ChangeCipherSpec ─────────────────────────│
   │<─── Finished (зашифровано) ───────────────────│
   │<═══ Зашифрованный обмен данными ══════════════>│

В TLS 1.3 handshake сокращён до одного round-trip (1-RTT), что значительно ускоряет установку соединения.

Цепочка доверия сертификатов

Пример
Root CA (корневой центр сертификации)
  │ подписывает
  ▼
Intermediate CA (промежуточный центр сертификации)
  │ подписывает
  ▼
Leaf Certificate (сертификат сервера / конечного субъекта)
  • Root CA — самоподписанный сертификат, хранится в хранилище доверенных сертификатов ОС/браузера
  • Intermediate CA — промежуточный сертификат, подписанный Root CA
  • Leaf Certificate — сертификат конкретного сервера, подписанный Intermediate CA

Клиент проверяет всю цепочку: leaf -> intermediate -> root. Если root CA присутствует в хранилище доверенных сертификатов — соединение доверенное.

Типы сертификатов

Тип Описание Применение
Самоподписанный Подписан собственным ключом Разработка, тестирование
Let’s Encrypt Бесплатный, автоматически обновляемый Публичные сервисы
Коммерческий CA Выдаётся DigiCert, GlobalSign и др. Продуктивные среды
Внутренний CA Собственный CA организации Внутренние сервисы, mTLS

Создание самоподписанного сертификата

Пример
# Генерация ключа и сертификата
openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt \
  -days 365 -nodes -subj "/CN=app-server.mybank.local"

# Просмотр содержимого сертификата
openssl x509 -in server.crt -text -noout

# Проверка цепочки сертификатов удалённого сервера
openssl s_client -connect app-server.mybank.local:443 -showcerts

Получение сертификата Let’s Encrypt

Пример
# Установка certbot
sudo apt install certbot python3-certbot-nginx

# Получение сертификата
sudo certbot --nginx -d api.mybank.com

# Автоматическое продление
sudo certbot renew --dry-run

Работа с сертификатами в Java

Java использует хранилища ключей (KeyStore) и доверенных сертификатов (TrustStore):

Пример
# Импорт сертификата в TrustStore
keytool -import -alias mybank-ca -file ca.crt \
  -keystore truststore.jks -storepass changeit

# Просмотр содержимого KeyStore
keytool -list -v -keystore keystore.jks -storepass changeit

# Конвертация PEM -> PKCS12 для Java
openssl pkcs12 -export -in server.crt -inkey server.key \
  -out keystore.p12 -name server -CAfile ca.crt -caname root

Настройка в Spring Boot:

Пример
server:
  ssl:
    key-store: classpath:keystore.p12
    key-store-password: ${SSL_KEYSTORE_PASSWORD}
    key-store-type: PKCS12
    enabled: true
    protocol: TLS
    enabled-protocols: TLSv1.3,TLSv1.2

На собеседовании: интервьюер ожидает понимание TLS Handshake (хотя бы на уровне «клиент и сервер обмениваются сертификатами и договариваются о ключе шифрования»), цепочки доверия и разницы между KeyStore и TrustStore в Java. Частая ошибка — путать SSL и TLS и не знать, какие версии считаются безопасными.