Когда ваш браузер подключается к HTTPS-сайту, он не доверяет сертификату вслепую. Он проверяет цепочку доверия — связанную последовательность сертификатов, ведущую от сертификата вашего сайта к предварительно доверенному корневому центру сертификации (CA).
Три уровня
┌─────────────────────────────────┐
│ ROOT CA │ Pre-installed in browsers/OS
│ (ISRG Root X1 for LE) │ Self-signed, long validity (20+ years)
└───────────────┬─────────────────┘
│ signs
▼
┌─────────────────────────────────┐
│ INTERMEDIATE CA │ Signed by the root
│ (Let's Encrypt R3/R10) │ Medium validity (5-10 years)
└───────────────┬─────────────────┘
│ signs
▼
┌─────────────────────────────────┐
│ YOUR CERTIFICATE │ Signed by the intermediate
│ (example.com) │ Short validity (90 days for LE)
└─────────────────────────────────┘
Корневой CA — является доверенным для браузеров и операционных систем. Хранится в хранилище сертификатов устройства. Самоподписанный (никто не подписывает за корневой — он САМ является якорем доверия). Корневые ключи хранятся в автономном режиме в аппаратных модулях безопасности.
Промежуточный CA — подписан корневым. Непосредственно выдаёт сертификаты конечных сущностей. Если промежуточный CA скомпрометирован, нужно отозвать только его — корневой остаётся в безопасности.
Сертификат конечной сущности — ваш сертификат. Подписан промежуточным CA. Именно его ваш сервер отправляет браузерам.
Как работает проверка
Когда ваш браузер получает сертификат:
- Читает ваш сертификат — извлекает имя издателя
- Находит промежуточный сертификат — из ответа сервера или из кэша браузера
- Проверяет подпись промежуточного — убеждается, что он подписан доверенным корневым
- Проверяет подпись вашего сертификата — убеждается, что он подписан промежуточным
- Проверяет даты действия — ни один из сертификатов не истёк
- Проверяет соответствие домена — SAN/CN сертификата совпадает с URL
- Проверяет отзыв — сертификат не был отозван (OCSP/CRL)
Если любой шаг не пройден → браузер показывает предупреждение безопасности.
Почему важен промежуточный сертификат
Самая распространённая ошибка SSL — отсутствие промежуточного сертификата. Если ваш сервер отправляет только ваш сертификат без промежуточного, браузеры не могут построить цепочку доверия.
Nginx ожидает fullchain.pem (ваш сертификат + промежуточный в одном файле):
ssl_certificate /etc/ssl/fullchain.pem; # cert + intermediate
Apache использует отдельные файлы:
SSLCertificateFile /etc/ssl/cert.pem # your cert
SSLCertificateChainFile /etc/ssl/chain.pem # intermediate
GetHTTPS предоставляет как fullchain.pem, так и отдельные файлы cert.pem + chain.pem, чтобы у вас был нужный формат для любого сервера.
Цепочка Let’s Encrypt
Текущая цепочка Let’s Encrypt:
ISRG Root X1 (root, in all trust stores)
└── Let's Encrypt R10 (intermediate, signs your cert)
└── yourdomain.com (your certificate)
Существует также кросс-подписанный путь через DST Root CA X3 от IdenTrust для совместимости со старыми устройствами, но в большинстве случаев он больше не нужен.
Часто задаваемые вопросы
Как исправить ошибку “сертификат не является доверенным”?
Почти всегда: отсутствует промежуточный сертификат. Используйте fullchain.pem (Nginx) или добавьте SSLCertificateChainFile chain.pem (Apache). Проверьте с помощью:
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com
Ищите “verify return:1” (хорошо) vs “verify return:0” (проблема с цепочкой).
Можно ли увидеть цепочку в браузере?
Да. Нажмите на замок → “Сертификат” (или “Подключение защищено” → “Сертификат действителен”). Вы увидите цепочку: ваш сертификат → промежуточный → корневой.
Что произойдёт, если корневой CA будет скомпрометирован?
Корневой удаляется из хранилищ доверия через обновления браузеров/ОС. Все сертификаты, выданные под этим корневым, становятся недоверенными. Это крайне редкое событие — корневые ключи хранятся в автономных аппаратных модулях безопасности с физическим контролем доступа.
Почему Let’s Encrypt использует промежуточный сертификат вместо прямой подписи корневым?
Изоляция безопасности. Если ключ промежуточного CA скомпрометирован, нужно отозвать только его — корневой остаётся в безопасности. Корневой ключ хранится в автономном режиме и используется только для подписи промежуточных сертификатов. Это стандартная практика для всех крупных центров сертификации.
Нужно ли устанавливать корневой сертификат на сервер?
Нет. Корневые сертификаты предустановлены в браузерах и операционных системах. Вашему серверу нужно отправлять только ваш сертификат + промежуточный. Браузер уже имеет корневой и использует его для проверки цепочки.
Диагностика проблем с цепочкой
Самая распространённая ошибка SSL в продакшене — неполная цепочка сертификатов. Вот систематический подход к диагностике:
Шаг 1: Проверьте цепочку, которую отправляет ваш сервер
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null
Посмотрите на вывод:
Certificate chain
0 s:CN = example.com
i:C = US, O = Let's Encrypt, CN = R10
1 s:C = US, O = Let's Encrypt, CN = R10
i:C = US, O = Internet Security Research Group, CN = ISRG Root X1
---
Verify return code: 0 (ok)
- Depth 0 = ваш сертификат
- Depth 1 = промежуточный
- “Verify return code: 0 (ok)” = цепочка полная
Если вы видите только depth 0 (без depth 1), промежуточный сертификат отсутствует.
Шаг 2: Исправьте цепочку
Nginx: Используйте fullchain.pem (сертификат + промежуточный в одном файле):
ssl_certificate /etc/ssl/fullchain.pem; # NOT cert.pem
Apache: Добавьте промежуточный явно:
SSLCertificateChainFile /etc/ssl/chain.pem
Если вы потеряли chain.pem: Скачайте промежуточный сертификат Let’s Encrypt с letsencrypt.org/certificates или перевыпустите сертификат с помощью GetHTTPS.
Шаг 3: Проверьте исправление
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | grep "Verify return code"
# Must say: Verify return code: 0 (ok)