Сопоставление сертификата и закрытого ключа

Вставьте сертификат, который использует сервер, и закрытый ключ, который вы собираетесь развернуть вместе с ним, и эта страница ответит на вопрос, на котором падает развёрнутый сайт: принадлежат ли эти два элемента одной паре ключей? Ответ — не догадка по длине модуля или одним лишь отпечаткам: страница подписывает фиксированный вызов закрытым ключом и проверяет эту подпись открытым ключом из сертификата. Если проверка проходит, оба элемента принадлежат друг другу; если нет, никакая правка конфигурации их не заставит работать. Оба чтения показаны рядом с алгоритмом, размером ключа, идентификатором ключа субъекта и отпечатком открытого ключа, и ничто из вставленного не покидает браузер.
1. Сертификат или цепочка
Вставляйте сколько угодно блоков. Каждый сертификат проверяется против каждого ключа, поэтому цепочка плюс один ключ точно скажет, какому сертификату в цепочке принадлежит этот ключ — обычный сюрприз на сервере, который отдаёт неверный сертификат из набора. Читаются PEM, голое тело base64 или шестнадцатеричное тело и контейнер PKCS#7 .p7b; проверка сертификата аудитирует сам сертификат, когда ключ установлен.
2. Закрытый ключ или открытый ключ
Понимаются PKCS#8 (BEGIN PRIVATE KEY), PKCS#1 (BEGIN RSA PRIVATE KEY), SEC1 (BEGIN EC PRIVATE KEY) и голый открытый ключ SPKI (BEGIN PUBLIC KEY), а также файл ключа, вставленный как base64 или шестнадцатеричный текст. Зашифрованный ключ PKCS#8 (BEGIN ENCRYPTED PRIVATE KEY) браузер прочитать не может, и об этом сообщается отдельно, с командой, которая убирает парольную фразу.
ещё ничего не проверено
Пример — это самоподписанный сертификат и принадлежащий ему закрытый ключ, сделанные для этой страницы и ничего не защищающие. Замените ключ любым другим, чтобы увидеть иной вердикт, или вставьте блок открытого ключа вместо закрытого, чтобы увидеть совпадение открытых ключей.
Закрытый ключ, вставленный в любую веб-страницу, заслуживает сначала второй мысли. Эта страница — один файл простого JavaScript, она ничего не загружает откуда-либо и не делает никаких запросов, поэтому ключ читается, используется и забывается внутри этой вкладки. Это всё ещё обещание, которое дал код, который вы можете прочитать, а не гарантия от сети, которую вы можете увидеть: если вы работаете с производственным ключом, работайте офлайн и помните, что самая надёжная проверка — та же команда openssl на вашем собственном сервере. Вставленный здесь ключ никогда не сохраняется, никогда не помещается в файл и никуда не отправляется — в том числе кнопками экспорта, которые записывают выводы о ключе, но никогда сам ключ.
Почему ответ — подпись. Два файла могут выглядеть похоже и всё же не совпадать: в большинстве руководств RSA-ключи сравнивают по модулю, но это работает только для RSA, а ключ может нести верный модуль с повреждённой экспонентой или неверным дополнением. Эта страница доказывает пару так же, как это делает рукопожатие: подписывает фиксированный вызов закрытым ключом и проверяет подпись открытым ключом из сертификата — поэтому вердикт верен для RSA, ECDSA и Ed25519 одинаково. Когда вставлена только открытая половина, сравниваются сами байты открытого ключа с байтами в сертификате; это столь же убедительно для идентичности, только без доказательства, что кто-то владеет закрытой половиной.

Чего совпадение не говорит. Что ключ — тот, который сервер действительно загрузил, что сертификат доверенный, что файл ключа на диске не повреждён или что его не скопировал кто-то другой. Оно также не может сказать, является ли сертификат тем, который получит клиент, поскольку балансировщик нагрузки или CDN перед сайтом может отдавать другой. Чтобы проверить, что реально отдаёт работающий сервер, выполните openssl s_client -connect example.com:443 -servername example.com -showcerts и вставьте этот вывод в поле сертификата.

Откуда берутся файлы. Сертификат — то, чем настроен ваш сервер, или то, что экспортировано из браузера или извлечено из пакета .p7b. Закрытый ключ — это файл, который веб-сервер читает при запуске, обычно что-то вроде privkey.pem или server.key. Если ключ зашифрован, сначала расшифруйте копию командой openssl pkcs8 -topk8 -nocrypt -in key.pem -out key-plain.pem, вставьте её и затем удалите копию.
Ещё ничего не проверено. Вставьте сертификат и ключ выше и нажмите Проверить, совпадают ли они. Вердикт появится здесь вместе с доказательствами, а отчёт можно скопировать или сохранить.
Та же проверка с openssl на вашей машине
# открытый ключ внутри сертификата openssl x509 -in cert.pem -noout -pubkey | openssl pkey -pubin -outform DER | openssl sha256 # открытый ключ внутри закрытого ключа openssl pkey -in key.pem -pubout | openssl pkey -pubin -outform DER | openssl sha256 # два дайджеста равны только тогда, когда пара принадлежит друг другу # старый способ только для RSA: сравнить модули openssl x509 -in cert.pem -noout -modulus | openssl md5 openssl rsa -in key.pem -noout -modulus | openssl md5
Сравнение дайджестов работает для всех типов ключей и совпадает с тем, что эта страница выводит как отпечаток открытого ключа, тогда как сравнение модулей существует только для RSA. Ни одно из них не доказывает, что кто-то владеет закрытой половиной — это делает проверка подписью выше, поэтому страница использует именно её.
Что содержит отчёт. Вердикт, пару чтений, из которых он получен (алгоритм, размер ключа, кривая, идентификатор ключа субъекта и отпечаток открытого ключа для сертификата и для ключа), и точный тест, который был выполнен. Отчёт никогда не содержит сам закрытый ключ: ключ используется для создания подписи и не записывается в текст, JSON или буфер обмена. То, что вы копируете или сохраняете, безопасно прикрепить к заявке; вставленный вами ключ — нет, и буфер обмена следует считать единственным другим местом, где он когда-либо существовал.

Конфиденциальность: сертификат и ключ читаются внутри вкладки, ничего не загружается, и страница вообще не делает запросов — здесь нет ни зондирования, ни поиска. Чтобы создать совпадающую пару, используйте генератор самоподписанных сертификатов; чтобы запросить сертификат для уже имеющегося ключа, используйте генератор CSR; чтобы прочитать содержимое сертификата, используйте декодер сертификатов.