Как работает 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 и не знать, какие версии считаются безопасными.