SSL/TLS

Протокол защищенного соединения: шифрует данные между браузером и сервером и подтверждает, что вы общаетесь с настоящим сайтом.

TLS (Transport Layer Security) — протокол, который защищает соединение между двумя программами: браузером и сайтом, приложением и API, двумя серверами. Он решает три задачи: шифрует данные, чтобы их никто не прочитал; защищает от подмены по дороге; подтверждает, что сервер — действительно тот, за кого себя выдает. Именно TLS превращает HTTP в HTTPS и дает замочек в адресной строке.

SSL — предшественник TLS. Все версии SSL давно признаны небезопасными и отключены, но название закрепилось: «SSL-сертификат» на деле означает сертификат для TLS. Актуальные версии — TLS 1.2 (2008) и TLS 1.3 (2018).

Как устанавливается соединение

  1. Клиент сообщает, какие версии и алгоритмы поддерживает.
  2. Сервер выбирает параметры и присылает свой сертификат.
  3. Клиент проверяет сертификат: выдан ли он доверенным центром, не истек ли, совпадает ли имя сайта.
  4. Стороны вырабатывают общий секретный ключ так, что подслушивающий его не узнает, и дальше все данные шифруются симметрично.

В TLS 1.3 рукопожатие занимает один обмен сообщениями вместо двух, а устаревшие алгоритмы убраны. Целостность данных обеспечивают алгоритмы аутентификации сообщений — родственники HMAC.

Сертификаты и цепочка доверия

Сертификат связывает имя сайта с его открытым ключом и подписан удостоверяющим центром. Браузер доверяет небольшому списку корневых центров, а те — промежуточным, которые выдают сертификаты сайтам. Бесплатные сертификаты на 90 дней выдает Let’s Encrypt, их выпуск и обновление автоматизируют. С 2022 года сертификаты российским сайтам выдает и Национальный удостоверяющий центр Минцифры. Для государственных систем применяется TLS с российскими криптоалгоритмами по ГОСТ.

Проверить сертификат

# Командная строка Linux
openssl s_client -connect example.ru:443 -servername example.ru </dev/null | openssl x509 -noout -dates -subject

Команда покажет, кому выдан сертификат и до какой даты он действует.

Типичные проблемы

  • Истекший сертификат — сайт или API внезапно перестает открываться. Сроки нужно отслеживать мониторингом, а продление — автоматизировать.
  • Неполная цепочка — сервер не прислал промежуточный сертификат, и часть клиентов, особенно мобильных, не доверяет сайту.
  • Устаревшие версии и шифры включены ради старых клиентов и ослабляют защиту всех.

Обычно TLS-соединения принимает веб-сервер или обратный прокси, например Nginx, а между внутренними сервисами используют взаимную проверку сертификатов (mTLS).