Все статьи о SSL SSL и сертификаты

Цепочка доверия сертификатов: подробное объяснение

Когда ваш браузер подключается к 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. Именно его ваш сервер отправляет браузерам.

Как работает проверка

Когда ваш браузер получает сертификат:

  1. Читает ваш сертификат — извлекает имя издателя
  2. Находит промежуточный сертификат — из ответа сервера или из кэша браузера
  3. Проверяет подпись промежуточного — убеждается, что он подписан доверенным корневым
  4. Проверяет подпись вашего сертификата — убеждается, что он подписан промежуточным
  5. Проверяет даты действия — ни один из сертификатов не истёк
  6. Проверяет соответствие домена — SAN/CN сертификата совпадает с URL
  7. Проверяет отзыв — сертификат не был отозван (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)

Похожие статьи

SSL и сертификаты 2026-05-07
Как работает SSL/TLS: TLS-рукопожатие в деталях
Наглядное объяснение TLS-рукопожатия -- как ваш браузер и сервер устанавливают зашифрованное соединение за миллисекунды. Охватывает TLS 1.2, TLS 1.3, возобновление сеанса и прямую секретность.
SSL и сертификаты 2026-05-07
Типы SSL-сертификатов: DV, OV и EV
Сравнение SSL-сертификатов с проверкой домена (DV), проверкой организации (OV) и расширенной проверкой (EV). Узнайте различия в верификации, стоимости и когда какой тип действительно нужен.
Развёртывание 2026-05-08
Как установить SSL-сертификат на Nginx
Пошаговое руководство по установке SSL-сертификата на Nginx. Охватывает загрузку файлов, полную конфигурацию серверного блока, лучшие практики TLS, HTTP/2, HSTS, настройку редиректов, тестирование и устранение 6 распространённых ошибок.
Получите бесплатный SSL-сертификат в браузере
Без установки, без аккаунта. Ваш приватный ключ никогда не покидает устройство.
Получить сертификат