Как извлечь корневой центр сертификации и подчиненный центр сертификации из цепочки сертификатов в Linux?

25

У меня есть сертификат конечного объекта / сервера, который имеет промежуточный и корневой сертификат. Когда я catна сертификате конечного объекта, я вижу только один BEGINи ENDтег. Это единственный сертификат конечного объекта.

Есть ли способ просмотра содержимого промежуточного и корневого сертификата. Мне нужно только содержание BEGINи ENDтег.

В Windows я вижу полную цепочку сертификатов из «Пути сертификации». Ниже приведен пример для сертификата Stack Exchange.

введите описание изображения здесь

Оттуда я могу выполнить Просмотр сертификата и экспортировать их. Я могу сделать это для корневого и промежуточного в Windows. Я ищу этот же метод в Linux.

введите описание изображения здесь

Анирбан Наг 'tintinmj'
источник
Пожалуйста, сообщите нам, кто выдал вам этот сертификат.
Руи Ф Рибейро
@RuiFRibeiro Допустим, кто-нибудь ... Я хочу увидеть цепочку сертификатов для стекового обмена с только основным сертификатом в руках.
Анирбан Наг 'tintinmj'

Ответы:

25

С веб-сайта вы можете сделать:

openssl s_client -showcerts -verify 5 -connect stackexchange.com:443 < /dev/null

Это покажет цепочку сертификатов и все сертификаты, представленные сервером.

Теперь, если я сохраню эти два сертификата в файлы, я могу использовать openssl verify:

$ openssl verify -show_chain -untrusted dc-sha2.crt se.crt 
se.crt: OK
Chain:
depth=0: C = US, ST = NY, L = New York, O = "Stack Exchange, Inc.", CN = *.stackexchange.com (untrusted)
depth=1: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert SHA2 High Assurance Server CA (untrusted)
depth=2: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA

-untrustedПараметр используется , чтобы дать промежуточный сертификат (ы); se.crtэто сертификат для проверки. Результат глубины = 2 поступил из доверенного хранилища CA системы.

Если у вас нет промежуточного сертификата (ов), вы не можете выполнить проверку. Вот как работает X.509.

В зависимости от сертификата он может содержать URI для получения промежуточного звена. В качестве примера openssl x509 -in se.crt -noout -textсодержит:

        Authority Information Access: 
            OCSP - URI:http://ocsp.digicert.com
            CA Issuers - URI:http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt

Этот URI «CA Issuers» указывает на промежуточный сертификат (в формате DER, поэтому вам необходимо использовать его openssl x509 -inform der -in DigiCertSHA2HighAssuranceServerCA.crt -out DigiCertSHA2HighAssuranceServerCA.pemдля преобразования для дальнейшего использования OpenSSL).

Если вы запустите, openssl x509 -in /tmp/DigiCertSHA2HighAssuranceServerCA.pem -noout -issuer_hashвы получите 244b5494, что вы можете найти в системном хранилище корневого центра сертификации /etc/ssl/certs/244b5494.0(просто добавьте .0к имени).

Я не думаю, что есть хорошая и простая команда OpenSSL, которая сделает все это за вас.

derobert
источник
Это главная проблема. У меня нет URL со мной. У меня есть только файл сертификата. И мне нужен зашифрованный контент между тегом BEGINи ENDтэгом (который вы получите только после catзагрузки файла .crt.
Anirban Nag 'tintinmj'
@ AnirbanNag'tintinmj 'Если вы просто хотите расшифровать сертификат, попробуйтеopenssl x509 -in file.crt -noout -text
derobert
Я хочу , чтобы содержание промежуточного в корневом CERT , который находится между BEGINи ENDтегами.
Анирбан Наг 'tintinmj'
Или, если вы можете дать команду, которая извлечет промежуточный и корневой сертификат из основного сертификата и сохранит его в файл ... Я тоже могу с этим жить.
Анирбан Наг 'tintinmj'
@ AnirbanNag'tintinmj 'Если он не отображается с openssl x509командой, я не думаю, что промежуточный сертификат есть. (Если вы не получили какую-то ошибку от openssl x509).
Дероберт
12

tl; dr - магия одного лайнера, чтобы сбросить все сертификаты в цепочке

openssl s_client -showcerts -verify 5 -connect de.wikipedia.org:443 < /dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".crt"; print >out}' && for cert in *.crt; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$/\1/; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done

Объяснение в 2 шага

Для сброса всех сертификатов в цепочке в текущий каталог cert${chain_number}.pem:

openssl s_client -showcerts -verify 5 -connect your_host:443 < /dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".pem"; print >out}' 

бонус-трек, чтобы переименовать их в их общее имя:

for cert in *.pem; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$/\1/; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done
estani
источник
Есть ли причина выбирать «.pem» вместо «.crt» в качестве расширения, поскольку вы только переименовываете их, а не меняете формат?
Капитан Мэн
Нет, не совсем. «.pem» - это формат (base64 из DER) «.crt» означает, что это сертификат, но ничего не говорит о кодировке. Я собирался сделать его более последовательным и назвать все pem ... Но я думаю, что проще прочитать в одном ряду, чтобы понять, где сертификат загружается (crt) и закончить то, что я обычно использую в мире Linux (pem) , Надеюсь, это прояснит ситуацию немного ...
estani
1
Да, я понимаю, что PEM - это формат, но я часто вижу crt и не был уверен, что это формат. Это на самом деле помогает объяснить, почему я вижу, что «ЭЛТ» используется так часто. Спасибо :)
Капитан Мэн
Кажется, это работает, только если вы уже доверяете источнику. Я пытаюсь загрузить пользовательский центр сертификации, но он загружает только первый сертификат, а не цепочку.
Мьяггард
@mjaggard странно, так как я использовал его именно для этого случая. При этом сервер может вообще не отправлять корневой ЦС, если вы посмотрите на мой пример, он раньше загружал 3 сертификата, сейчас он загружает только 2. Я предполагаю, что сервер Википедии не отправляет корневой каталог (на самом деле нет Дык, если у тебя его нет, ты все равно не будешь ему доверять ...). Я уверен, что это было не так раньше.
estani