Из-за временных ограничений на территории РФ наблюдаются проблемы с оплатой. Если платёж не проходит, оставьте запрос в службу поддержки.Служба поддержки работает 24/7 — мы всегда на связи по вопросам хостинга и серверов.Открыт прием заявок на аренду выделенных серверов и размещение оборудования в дата-центре.Напоминаем: рекомендуем включить резервное копирование для дополнительной защиты данных.Доступна новая линейка VPS/VDS с NVMe-дисками и увеличенной производительностью.Технические работы на части серверов завершены. Все сервисы работают в штатном режиме.
Статья6 мин чтенияПросмотры0

Как проверить, что TLS-сертификат соответствует приватному ключу

До reload извлекаем открытый ключ из сертификата и приватного ключа, сравниваем SHA-256 и отдельно обрабатываем ошибку чтения. Проверено на OpenSSL 3.0.13: совпадение, другая пара и повреждённый файл.

Комментарии 0

Сертификат, металлический ключ и серверная стойка перед проверкой конфигурации
В этой статье

Если новый TLS-сертификат и приватный ключ относятся к разным парам, веб-сервер не сможет использовать их как одну конфигурацию. До reload извлеките открытый ключ из сертификата и из приватного ключа, выведите оба в DER и сравните SHA-256. Совпали хеши — пара соответствует. Различаются — ничего не применяйте: сначала установите причину различий.

Совпадение DER-представлений открытого ключа подтверждает соответствие пары, но не имя сайта, срок действия, цепочку доверия или то, какой сертификат уже отдаёт сервер. Различие DER ещё не доказывает, что ключи разные: нужно проверить также способ представления параметров. Эта проверка не заменяет остальные этапы приёмки TLS.

Входные условия

  • Linux с OpenSSL 3.x и GNU Coreutils; команды проверены на OpenSSL 3.0.13.

  • Сертификат в PEM-файле cert.pem и приватный ключ в private-key.pem. Для DER или PKCS#12 нужны другие параметры чтения.

  • Права только на чтение нужных файлов. Не копируйте приватный ключ в общий каталог и не публикуйте его содержимое.

  • Проверка выполняется до изменения конфигурации и не требует reload, restart или сетевого обращения.

Сначала убедитесь, что оба файла читаются

Начните с сертификата. Команда показывает субъект, издателя и даты, но не меняет файл:

openssl x509 -in cert.pem -noout -subject -issuer -dates

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

Отдельно проверьте структуру приватного ключа:

openssl pkey -in private-key.pem -check -noout

Для зашифрованного ключа OpenSSL запросит пароль. Не добавляйте секрет прямо в команду ради удобства: он может попасть в историю оболочки, список процессов или журнал автоматизации.

Извлеките один и тот же объект с двух сторон

Команда openssl x509 умеет вывести открытый ключ сертификата, а openssl pkey — открытую часть приватного ключа. DER убирает различия текстового оформления PEM, после чего можно сравнивать два SHA-256. Но DER не унифицирует все способы записи параметров: например, один EC-ключ с именованной кривой и с явными параметрами может дать разные хеши. При различии сначала диагностируют пару и представление параметров; сертификат не перевыпускают вслепую.

Хеш открытого ключа из сертификата:

openssl x509 -in cert.pem -pubkey -noout \ | openssl pkey -pubin -outform DER \ | sha256sum

Хеш открытой части приватного ключа:

openssl pkey -in private-key.pem -pubout -outform DER \ | sha256sum

В проверенной паре обе команды вернули один и тот же SHA-256 и код 0. Для другого корректного ключа обе команды также завершились без ошибки, но хеши различались. Поэтому отдельный зелёный код команды не доказывает совпадение пары.

Наблюдение

Вывод

Действие

Оба конвейера завершились с кодом 0, хеши одинаковы

Сертификат соответствует ключу

Перейти к проверке конфигурации сервиса

Оба конвейера завершились с кодом 0, хеши различаются

Соответствие пары по DER не подтверждено

Не применять; проверить пару и представление параметров. Подбирать другой ключ или перевыпускать сертификат только после диагностики

Хотя бы один конвейер завершился с ненулевым кодом

Файл не разобран или команда не выполнена

Исправить путь, формат, права или пароль; хеши не сравнивать

Безопаснее сравнивать скриптом с pipefail

При ручном копировании легко не заметить ошибку первой команды конвейера. В учебном тесте без pipefail повреждённый сертификат дошёл до sha256sum как пустой ввод. Получился известный хеш пустых данных — внешне обычная строка, хотя сертификат не был прочитан.

Ниже минимальная проверка. Она возвращает 0 при совпадении SHA-256 от DER-представлений, 1 при их различии и 2, если сертификат или ключ не удалось разобрать:

set -o pipefail cert_hash="$({ openssl x509 -in cert.pem -pubkey -noout | openssl pkey -pubin -outform DER | sha256sum | awk '{print $1}' })" || exit 2 key_hash="$({ openssl pkey -in private-key.pem -pubout -outform DER | sha256sum | awk '{print $1}' })" || exit 2 if [ "$cert_hash" = "$key_hash" ]; then printf 'MATCH sha256=%s\n' "$cert_hash" exit 0 fi printf 'MISMATCH cert_sha256=%s key_sha256=%s\n' \ "$cert_hash" "$key_hash" exit 1

Запускайте такой фрагмент в оболочке, где поддерживается pipefail, например Bash. Для автоматизации сохраните только итог и коды возврата; содержимое приватного ключа в отчёт не нужно.

Что показал воспроизводимый тест

Стенд: OpenSSL 3.0.13, Bash и временный каталог. Я создал две отдельные учебные RSA-пары, выпустил для каждой самоподписанный сертификат на два дня и выполнил сценарий дважды. Рабочие сертификаты, ключи и домены не использовались.

Сценарий

Наблюдение

Код

cert-a.pem + key-a.pem

MATCH; одинаковый SHA-256

0

cert-a.pem + key-b.pem

MISMATCH; два разных SHA-256

1

Повреждённый сертификат + key-a.pem

OpenSSL не прочитал сертификат; сравнение не выполнялось

2

openssl pkey -check для key-a.pem

Key is valid

0

Случайные ключи дают новые значения SHA-256 при каждом прогоне, поэтому важны равенство или различие и код возврата, а не конкретная строка хеша.

Три результата проверки пары: совпадение — 0, несовпадение — 1, ошибка чтения — 2
Учебный тест OpenSSL 3.0.13: совпадение, другая корректная пара и повреждённый сертификат дают разные результаты и коды возврата.

Не перепутайте сертификат сайта с цепочкой

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

Не переставляйте сертификаты в рабочем fullchain наугад. Порядок и способ подключения зависят от веб-сервера и формата конфигурации; сначала работайте с копией и проверяйте окончательный набор файлов штатной командой сервиса.

Границы проверки

  • Совпадение открытых ключей не подтверждает, что сертификат ещё действует.

  • Оно не проверяет, покрывает ли сертификат нужное DNS-имя.

  • Оно не строит цепочку до доверенного корневого центра.

  • Оно не доказывает, что Nginx, Apache или балансировщик уже использует именно эти файлы.

  • Ключ в HSM или внешнем хранилище может не читаться как обычный PEM-файл; используйте контракт провайдера ключа.

  • Ненулевой код нельзя исправлять ослаблением прав или копированием секрета в доступное место без разбора причины.

Совпадение сертификата и ключа подтверждено, а имя, даты, цепочка, конфигурация и живое TLS требуют отдельных проверок
Совпадение открытых ключей подтверждает только пару файлов; остальные свойства TLS принимаются отдельно.

Что проверить перед и после применения

  1. До изменения: совпадение пары, ожидаемые subject и даты, резервная копия текущей конфигурации и точные пути файлов.

  2. Перед reload: штатный тест конфигурации конкретного сервиса и той же сборки, которая обслуживает сайт.

  3. После применения: ответ нужного виртуального хоста по TLS, имя, даты и цепочка фактически отданного сертификата.

  4. При нескольких узлах: проверить каждый путь доставки отдельно; один успешный ответ не описывает весь кластер.

Для Nginx сначала выполните проверку конфигурации до её применения. После изменения сравните не файл на диске, а сертификат реального соединения; для этого можно использовать проверку SSL на сайте.

Критерий готовности

Пара готова к следующему этапу, когда оба файла отдельно читаются, скрипт вернул MATCH с кодом 0, данные сертификата ожидаемы, конфигурация сервиса прошла собственный тест, а после контролируемого применения реальное соединение отдаёт новый сертификат. Если любой шаг не подтверждён, остановитесь на диагностике: reload не исправляет неверную пару.

Обсуждение 0

Делись опытом и задавай вопросы. Комментарии без ссылок появляются после проверки редактором.

Пока никто не написал. Начни обсуждение.