Сначала зафиксируйте условия ошибки
До изменения файлов сохраните точный текст ошибки, DNS-имя, порт, время события с часовым поясом, тип клиента и его версию. Сообщение certificate verify failed само по себе недостаточно: его могут вызвать срок действия, имя, недоверенный CA, неполная цепочка или проверка отзыва.
- Имя должно быть именно тем, к которому подключается клиент:
api.example.comиexample.com— разные проверки. - Укажите порт сервиса. TLS может завершаться не только на
443, но и на почтовом, административном или внутреннем endpoint. - Зафиксируйте, где произошла проверка: браузер, Java-приложение, почтовый клиент, агент мониторинга и ОС могут использовать разные хранилища доверенных сертификатов и политику отзыва.
- Проверьте время именно на клиенте, который отклонил соединение. В контейнере, виртуальной машине или устройстве оно может отличаться от времени на сервере.
О версиях и документации
openssl <команда> -help и руководством установленной версии. Названия директив сертификата, ключа, цепочки, reload и статусов зависят от TLS-терминатора, его версии, ОС и схемы установки. Для изменения конфигурации используйте официальное руководство именно вашего веб-сервера, почтового сервиса, балансировщика, CDN или приложения.Диагностический маршрут: что сервер отдаёт на самом деле
Проверка публичного TLS-endpoint через OpenSSL
Используйте OpenSSL с тем же именем и портом, которые применяет проблемный клиент. Это проверяет доступный endpoint, а не файл сертификата на диске.
- 1Подключитесь с SNIПередайте имя через
-servername. SNI позволяет серверу выбрать нужный виртуальный хост и сертификат до HTTP-запроса. - 2Получите переданные сертификатыОпция
-showcertsвыводит сертификаты, присланные сервером. Сохраните вывод: первый сертификат обычно является сертификатом сервиса, следующие — кандидатами на промежуточные звенья цепочки. - 3Проверьте имя и доверие отдельноОпция
-verify_hostnameзадаёт имя для проверки имени хоста.-CAfileи-CApathзадают доверенные CA для этой проверки; они не добавляют промежуточные сертификаты в ответ сервера. Для диагностического отказа при ошибке проверки добавьте-verify_return_error. - 4Сопоставьте результат с клиентомСравните Subject, SAN, Issuer, даты и список сертификатов с ожидаемыми. Успешный результат OpenSSL означает только успешную проверку в указанной конфигурации OpenSSL, а не идентичное поведение браузера, Java, почтового клиента или библиотеки приложения.
openssl s_client -connect example.com:443 -servername example.com -showcerts -verify_hostname example.com -verify_return_error </dev/nullПри успешной проверке обычно будет `Verify return code: 0 (ok)`. Ненулевой код — основание проверить конкретную причину, а не отключать проверку.Не отключайте проверку как «исправление»
Как посмотреть даты, Subject, Issuer, SAN и отпечаток PEM-сертификата
Файл PEM-сертификата можно изучить локально командой openssl x509. Она показывает содержимое одного сертификата, но не подтверждает, что его использует работающий сервис. Д ля DER-файла укажите -inform DER; формат файла и расширение не следует определять только по имени.
openssl x509 -in server-cert.pem -noout -dates -subject -issuer -ext subjectAltName -fingerprint -sha256Поле Subject полезно для идентификации, но проверка имени хоста опирается прежде всего на SAN. Отпечаток позволяет без передачи самого сертификата сопоставить экземпляры в конфигурации, журналах и на endpoint.
Certificate has expired: срок сертификата, часы клиента или другой виртуальный хост
Проблема
Ошибка certificate has expired или certificate is not yet valid
Возможные причины
- Поле `Not After` у фактически предъявленного сертификата уже прошло.
- Дата или системное время на проверяющем клиенте неверны; тогда действующий сертификат может выглядеть просроченным либо ещё не действующим. Часовой пояс важен для интерпретации журналов и ручной настройки часов, но при корректном абсолютном времени сам по себе обычно не меняет результат проверки.
- Из-за отсутствующего или другого SNI сервер отдал сертификат другого виртуального хоста.
- Просрочен не конечный, а промежуточный сертификат в пути, который строит клиент.
Решение
Сначала выполните openssl s_client с -servername, затем извлеките и проверьте даты первого и всех переданных сертификатов. Сверьте дату и системное время проблемного клиента с надёжным источником времени. Если с SNI выводится актуальный сертификат, а без него — другой, исправляйте выбор виртуального хоста или настройки клиента, который не передаёт SNI. Если просрочен действительно используемый сертификат, установите замену вместе с корректной цепочкой и примените конфигурацию способом, указанным в документации сервиса.
Как избежать
Контролируйте срок сертификата на внешнем endpoint и отдельно время на клиентских системах; проверка только файла в каталоге сертификатов не заменяет такой контроль.
Неверное время на сервере не меняет то, как удалённый клиент сравнивает даты уже предъявленного сертификата: клиент использует собственные часы. Однако время сервера может влиять на выпуск и продление сертификата, выбор серти фиката приложением, журналы и работу OCSP stapling, поэтому его также следует синхронизировать и проверять отдельно.
Hostname mismatch: имя должно быть в SAN
Проблема
Ошибка hostname mismatch, ssl certificate mismatch или отказ проверки имени
Возможные причины
- DNS-имя, к которому подключается клиент, отсутствует среди DNS-значений SAN.
- Клиент подключается по IP-адресу, но в SAN нет соответствующего IP-значения.
- Сервис отдал сертификат другого virtual host из-за неверного или отсутствующего SNI.
- Клиент использует внутреннее имя, алиас или имя балансировщика, которое не было включено в сертификат.
Решение
Посмотрите SAN у сертификата, полученного с endpoint, и найдите точное имя подключения. Если имени нет, выпустите и установите сертификат с нужным SAN либо измените конфигурацию клиента на имя, которое уже корректно включено в SAN. Если сертификат правильный только при -servername example.com, настройте SNI у клиента или корректный default virtual host согласно документации TLS-терминатора.
Как избежать
Включайте в заявку на сертификат все реальные DNS-имена и IP-адреса, которыми пользуются клиенты, включая имена reverse proxy и внутренние endpoint.
openssl x509 -in server-cert.pem -noout -ext subjectAltNameCN не заменяет SAN
Chain incomplete и unable to verify certificate
Цепочка сертификатов должна связать конечный сертификат сервиса с доверенной точкой клиента. Частая причина chain incomplete — сервер не передаёт нужный промежуточный сертификат. Ошибку также вызывают промежуточный сертификат от другого выпуска CA и порядок сертификатов, не соответствующий формату конкретного TLS-терминатора. Лишние или не связанные с путём сертификаты могут мешать отдельным продуктам и клиентам, но одно их наличие ещё не доказывает причину отказа.
| Компонент | Роль | Где должен находиться |
|---|---|---|
| Сертификат сервиса | Идентифицирует endpoint и содержит его открытый ключ | Первым в серверной выдаче и в файле/настройке, если сервис ожидает объединённую цепочку |
| Промежуточный CA | Связывает сертификат сервиса с доверенным CA | Обычно передаётся сервером после сертификата сервиса |
| Корневой сертификат | Точка доверия клиента | Обычно находится в trust store клиента, а не передаётся сервером |
Как проверить локальный сертификат и цепочку
openssl verify -CAfile trusted-roots.pem -untrusted intermediates.pem server-cert.pemУспешная проверка обычно выводит `server-cert.pem: OK`. Параметр `-untrusted` не делает промежуточные сертификаты доверенными точками: доверие должно завершаться сертификатом из указанного trust store. Ошибки `unable to get local issuer certificate` и `unable to get issuer certificate` требуют проверить состав промежуточных сертификатов и доверенных корней.Проблема
Сервер отдаёт неполную цепочку или клиент не может построить путь доверия
Возможные причины
- Изменён не тот компонент: TLS завершается на CDN, балансировщике, reverse proxy, почтовом шлюзе или другом фронтенде.
- TLS-терминатор загрузил только конечный сертификат либо использует старый файл, секрет или объект конфигурации.
- У клиента отсутствует подходящий доверенный корень или он строит другой путь сертификации.
Решение
Сравните SHA-256-отпечаток первого сертификата из s_client с сертификатами на каждом предполагаемом TLS-терминаторе. По схеме сервиса определите компонент, который принимает TLS-соединение на проверяемом имени и порту. Затем найдите в официальном руководстве именно его версии параметры конечного сертификата, цепочки и закрытого ключа, источник секрета и способ проверки конфигурации и reload. После изменения снова проверьте внешний endpoint: успешная локальная проверка файла не подтверждает, что этот файл загрузил обслуживающий соединение компонент.
Как избежать
Документируйте владельца TLS-терминации, источник сертификата и цепочки, способ применения конфигурации и проверяемый внешний endpoint.
Доверенный CA зависит от хранилища клиента
- В Debian и Ubuntu локальный корневой CA в PEM-формате обычно помещают отдельным файлом с расширением
.crtв/usr/local/share/ca-certificates/, после чего запускаютupdate-ca-certificates. - В актуальных RHEL-совместимых системах локальный корневой CA обычно помещают в
/etc/pki/ca-trust/source/anchors/, после чего запускаютupdate-ca-trust. - Пути, команды и поддерживаемые форматы сверяйте с документацией семейства и версии ОС. Java, браузер, контейнер или само приложение могут использовать собственное хранилище и не принять CA, добавленный только в системное.
- Корневой сертификат внутреннего CA распространяйте только по контролируемому каналу и только на нужные клиенты. Добавление корня означает доверие всем сертификатам, которые этот CA вправе выпускать.
