Короткий ответ
TLS handshake включает согласование версии протокола и набора шифров, передачу сертификата сервера, проверку его клиентом, обмен материалом для генерации общего сеансового ключа (например, через Diffie-Hellman) и переход к зашифрованной передаче данных; SNI (Server Name Indication) — поле в начальном ClientHello, которое сообщает серверу желаемое доменное имя ещё до шифрования, что позволяет одному IP и порту обслуживать разные сертификаты для разных доменов (virtual hosting по HTTPS).
Как это работает подробнее
В TLS 1.3 рукопожатие сокращено до одного round-trip (а при session resumption — до нуля) по сравнению с двумя round-trip в TLS 1.2, за счёт более ранней отправки параметров шифрования клиентом и отказа от небезопасных алгоритмов обмена ключами, оставляя только варианты с прямой секретностью (forward secrecy); при истечении срока действия сертификата клиенты, строго проверяющие цепочку доверия, начинают отклонять соединение ещё до прикладного уровня, независимо от того, насколько исправно работает само приложение.
Пример кода
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -enddateЧто использовать на практике
- Практика. при истёкшем сертификате нужно немедленно выпустить и установить новый сертификат (вручную через CA либо автоматически через ACME/Let's Encrypt), перезагрузить конфигурацию веб-сервера или балансировщика без простоя (graceful reload), и в дальнейшем настроить мониторинг оставшегося срока действия сертификатов и автоматическое продление задолго до истечения, чтобы инцидент не повторялся.
Подводные камни
- Риск. Частая ошибка — продлевать сертификат вручную в последний момент без автоматизации и мониторинга срока действия, из-за чего случайный пропуск напоминания приводит к полному отказу HTTPS-сервиса для всех клиентов.