1. Основы TLS и цепочки доверия
Основы TLS и цепочки доверия
Почему браузер показывает замок рядом с адресом сайта, а ваш внутренний сервис на https://192.168.1.10 выдаёт ошибку «NET::ERR_CERT_AUTHORITY_INVALID»? Ответ кроется в механизме цепочки доверия — системе, которая решает, кому верить в мире цифровых сертификатов. Без понимания этого механизма любая настройка SSL в микросервисах превращается в гадание.
Что такое TLS и зачем он нужен в микросервисах
TLS (Transport Layer Security) — криптографический протокол, который решает три задачи одновременно: шифрует данные при передаче, гарантирует их целостность и подтверждает подлинность сервера. В отличие от своего предшественника SSL, TLS использует более стойкие алгоритмы шифрования и защищён от известных атак типа POODLE и BEAST.
В микросервисной архитектуре TLS нужен не только на границе «клиент — сервер». Каждый межсервисный вызов — потенциальная точка перехвата. Если сервис A обращается к сервису B по HTTP внутри контейнерной сети, любой компрометированный контейнер может читать трафик. Поэтому mTLS (mutual TLS) — когда оба участника соединения предъявляют сертификаты — становится стандартом для zero-trust архитектур.
Как работает TLS-рукопожатие
Когда клиент подключается к серверу по HTTPS, происходит TLS-рукопожатие — последовательность шагов, за которую стороны договариваются о параметрах шифрования:
ClientHello с поддерживаемыми версиями протокола и наборами шифров.ServerHello, выбирая версию и шифр, затем передаёт свой сертификат.Весь процесс занимает около 100–300 мс. В микросервисах с тысячами запросов в секунду это накладные расходы, которые нужно учитывать при проектировании.
Цепочка доверия: от корня до листа
Сертификат — это цифровой документ, который связывает открытый ключ с идентификатором (доменным именем, IP или организацией). Но кто гарантирует, что этот документ подлинный? Здесь вступает в игру цепочка доверия.
Цепочка состоит из трёх типов сертификатов:
| Тип | Роль | Пример |
|-----|------|--------|
| Root CA (корневой) | Самый верхний уровень доверия. Хранится в хранилище доверенных сертификатов ОС/браузера | ISRG Root X1 (Let's Encrypt), DigiCert Global Root |
| Intermediate CA (промежуточный) | Подписывается корневым. Именно им подписываются листовые сертификаты | Let's Encrypt R3, R10 |
| End-entity (листовой) | Привязан к конкретному домену или IP. Устанавливается на сервер | Сертификат для api.example.com |
Почему нельзя подписывать листовые сертификаты напрямую корневым? Потому что корневой ключ — это «ключ от королевства». Он хранится в оффлайн-хранилище (HSM), доступ к нему строго ограничен. Если он скомпрометирован, доверие ко всей инфраструктуре утрачено. Промежуточные сертификаты действуют как буфер: их можно отозвать и перевыпустить без замены корневого.
Проверка цепочки работает так: клиент получает листовой сертификат, находит в нём ссылку на издателя (промежуточный CA), затем проверяет подпись промежуточного сертификата корневым. Если корневой сертификат есть в хранилище доверенных — цепочка валидна.
Форматы сертификатов: PEM, DER, PKCS
На практике вы встретите несколько форматов хранения сертификатов:
-----BEGIN CERTIFICATE-----. Самый распространённый в Linux-среде и Nginx.В Docker-окружениях вы почти всегда работаете с PEM. Конвертация между форматами выполняется через OpenSSL:
SAN и CN: почему доменное имя — не всё
В современных сертификатах основным идентификатором является поле Subject Alternative Name (SAN), а не устаревшее Common Name (CN). SAN позволяет указать в одном сертификате несколько доменов и IP-адресов:
Браузеры начиная с Chrome 58 игнорируют CN, если SAN не пуст. Это критичный момент: если вы создаёте самоподписанный сертификат для IP-адреса 192.168.1.10 и не добавляете его в SAN, браузер отклонит соединение, даже если CN указан корректно.
Где хранятся доверенные корневые сертификаты
Каждая ОС и среда выполнения имеет своё хранилище доверенных CA:
/etc/ssl/certs/ (Debian/Ubuntu), /etc/pki/tls/certs/ (RHEL/CentOS). Обновляется командой update-ca-certificates или update-ca-trust.ca-certificates, хранилище /etc/ssl/cert.pem.NODE_EXTRA_CA_CERTS.cacerts в $JAVA_HOME/lib/security/cacerts. Управляется через keytool.certifi, своё хранилище в certifi.where().В Docker-контейнерах на базе Alpine часто возникает ошибка «unable to get local issuer certificate» именно потому, что пакет ca-certificates не установлен или устарел. Решение — добавить в Dockerfile:
Самоподписанные сертификаты и приватные CA
В закрытых контурах — внутренних сетях, CI/CD-пайплайнах, связке микросервисов — нет смысла покупать публичный сертификат. Здесь используют два подхода:
Второй подход масштабируется лучше: добавляете корневой сертификат CA в доверенные хранилища один раз, и все выпущенные им листовые сертификаты автоматически признаются валидными. Именно этот подход мы детально разберём в следующих статьях курса.
> Цепочка доверия — это не просто технический механизм, а модель принятия решений: «Кому я готов доверять?». В публичном интернете ответ дают браузеры и ОС. В закрытом контуре этот ответ даёте вы сами.