Я создаю собственную цепочку сертификатов со следующими компонентами:
Root Certificate - Intermediate Certificate - User Certificate
Корневой сертификат - это самоподписанный сертификат, промежуточный сертификат подписан корневым сертификатом, а пользователь - промежуточным звеном.
Теперь я хочу проверить, привязан ли сертификат пользователя к корневому сертификату.
С участием
openssl verify -verbose -CAfile RootCert.pem Intermediate.pem
проверка в порядке. На следующем этапе я подтверждаю сертификат пользователя с помощью
openssl verify -verbose -CAfile Intermediate.pem UserCert.pem
и проверка показывает
error 20 at 0 depth lookup:unable to get local issuer certificate
Что случилось?
источник
man verify
, я обнаружил, что этот-untrusted
параметр является правильным для использования при указании промежуточного сертификата.-untrusted
не проверяет, является ли цепочка сертификатов полностью действительной. Пожалуйста, подумайте о том, чтобы передать как промежуточный, так и root в команду,-CAfile
как предлагает другие вопросы.openssl verify -CAfile /usr/local/etc/openssl/cert.pem -untrusted Intermediate.pem UserCert.pem
Это одна из немногих законных вакансий для
cat
:Обновить:
Как указывает в комментариях Грег Сметеллс, эта команда неявно доверяет Intermediate.pem . Я рекомендую прочитать первую часть поста Ссылки Грега (вторая часть специально посвящена pyOpenSSL и не имеет отношения к этому вопросу).
На случай, если пост уйдет, процитирую важные абзацы:
Кажется, openssl перестанет проверять цепочку, как только будет обнаружен корневой сертификат, который также может быть Intermediate.pem, если он самоподписанный. В этом случае RootCert.pem не рассматривается. Поэтому убедитесь, что Intermediate.pem исходит из надежного источника, прежде чем полагаться на приведенную выше команду.
источник
Проблема в том, что
openssl -verify
это не работает.Как упоминал Прияди ,
openssl -verify
останавливается на первом самоподписанном сертификате, поэтому вы на самом деле не проверяете цепочку, так как часто промежуточный сертификат самозаверяющий.Обратите внимание, что ответ Питера правильный , однако вывод
openssl -verify
не указывает на то, что после этого все действительно работает. Да, могут возникнуть некоторые проблемы, но не все.Вот сценарий, который проверяет цепочку сертификатов перед ее установкой в Apache. Возможно, это можно улучшить с помощью более мистической магии OpenSSL, но я не гуру OpenSSL и следующие работы:
Существует GitHub Gist, в котором могут быть некоторые обновления
Предпосылки для этого скрипта:
/etc/ssl/certs
как обычно, например, в UbuntuDIR
котором вы храните 3 файла:DIR/certificate.crt
который содержит сертификатDIR/certificate.key
который содержит секретный ключ для вашего веб-сервиса (без парольной фразы)DIR/certificate.bundle
который содержит CA-Bundle. О том, как подготовить связку, читайте ниже../check DIR/certificate
(предполагается, что скрипт названcheck
в текущем каталоге)CA-Bundle is not needed
. Это означает, что вы (читайте/etc/ssl/certs/
:) уже доверяете сертификату подписи. Но в WWW это маловероятно.Как создать
certificate.bundle
файл?В WWW цепочка доверия обычно выглядит так:
/etc/ssl/certs
certificate.crt
)Теперь оценка происходит снизу вверх, это означает, что сначала ваш сертификат считывается, затем требуется неизвестный промежуточный сертификат, затем, возможно, сертификат с перекрестной подписью, а затем
/etc/ssl/certs
проводится консультация для поиска правильного доверенного сертификата.Пакет ca-bundle должен быть составлен в точном соответствии с правильным порядком обработки, это означает, что первый необходимый сертификат (промежуточный сертификат, который подписывает ваш сертификат) идет первым в пакете. Тогда потребуется сертификат с перекрестной подписью.
Обычно ваш CA (орган, подписавший ваш сертификат) уже предоставляет такой правильный файл ca-bundle. Если нет, вам нужно собрать все необходимые промежуточные сертификаты и
cat
их вместе в один файл (в Unix). В Windows вы можете просто открыть текстовый редактор (например,notepad.exe
) и вставить сертификаты в файл, первый из которых должен быть поверх остальных, а после остальных.Есть еще кое-что. Файлы должны быть в формате PEM. Некоторые центры сертификации выдают формат DER (двоичный). PEM легко обнаружить: он читается в кодировке ASCII. Подробнее о том, как преобразовать что-либо в PEM, см. В разделе Как преобразовать .crt в .pem и следовать по дороге из желтого кирпича.
Пример:
У тебя есть:
intermediate2.crt
промежуточный сертификат, который подписал вашcertificate.crt
intermediate1.crt
еще один промежуточный сертификат, который подписалintermediate2.crt
crossigned.crt
который является сертификатом перекрестной подписи от другого центра сертификации, который подписалintermediate1.crt
crossintermediate.crt
который является еще одним промежуточным звеном от другого подписанного CAcrossigned.crt
(вы, вероятно, никогда не увидите такого)Тогда правильный
cat
будет выглядеть так:А как узнать, какие файлы нужны или нет и в какой последовательности?
Что ж, экспериментируйте, пока
check
все в порядке. Это похоже на компьютерную головоломку, в которой нужно разгадывать загадку. Каждый. Не замужем. Время. Даже для профи. Но каждый раз, когда вам нужно это делать, вы будете поправляться. Так что вы определенно не одиноки со всей этой болью. Это SSL, понимаешь? SSL, вероятно, является одним из худших проектов, которые я когда-либо видел за более чем 30 лет профессионального системного администрирования. Вы когда-нибудь задумывались, почему криптовалюта не стала мейнстримом за последние 30 лет? Поэтому. 'достаточно.источник
Мне нужно было проверить сертификат letsencrypt, и я сделал это так:
Выполните эту команду:
источник
После целого дня работы над одной и той же проблемой, не зная заранее SSL-сертификатов, я загрузил диспетчер хранилищ ключей CERTtivity. импортировал в него свое хранилище ключей и получил четкую визуализацию цепочки сертификатов.
Скриншот :
источник
openssl verify
.Если вы хотите , чтобы убедиться , что эмитент в
UserCert.pem
действительностиIntermediate.pem
сделать следующее (пример использования:OpenSSL 1.1.1
):и вы получите:
или
источник
openssl verify -no-CAfile -no-CApath -partial_chain -trusted Intermediate.pem UserCert.pem
в Python 3.7?Вы можете легко проверить цепочку сертификатов с помощью openssl. Полная цепочка будет включать сертификат CA, поэтому вы должны увидеть подробную информацию о CA и самом сертификате.
openssl x509 -in fullchain.pem -text -noout
источник