Як витягнути Root CA і Subordinate CA з ланцюга сертифікатів в Linux?


25

У мене є сертифікат кінцевої особи / сервера, який має проміжний та кореневий сертифікат. Коли я перебуваю catна сертифікаті кінцевої сутності, я бачу лише один BEGINі ENDтег. Це єдиний сертифікат кінцевої особи.

Чи є спосіб переглядати вміст проміжного та кореневого сертифіката. Мені потрібен лише вміст BEGINта ENDтег.

У Windows я бачу повний ланцюг cert з "Шляху сертифікації". Нижче наводиться приклад сертифіката Stack Exchange.

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

Звідти я можу виконати сертифікат перегляду та експортувати їх. Я можу це зробити як для кореневих, так і для проміжних в Windows. Я шукаю цей самий метод в Linux.

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


Скажіть, будь ласка, хто вам видав цю серт.
Rui F Ribeiro

@RuiFRibeiro Скажімо, хтось ... Я хочу побачити ланцюжок cert для stackexchange з лише первинним сертифікатом в руці.
Anirban Nag '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, що ви можете шукати в системному кореневому магазині CA /etc/ssl/certs/244b5494.0(просто додайте .0до назви).

Я не думаю, що є приємна, проста команда OpenSSL, щоб зробити все це за вас.


У цьому головна проблема. У мене немає URL-адреси зі мною. У мене є лише файл сертифіката. І мені потрібен зашифрований вміст між BEGINта ENDтегом (який ви отримаєте лише після catтого, як ви перекажете файл .crt.
Anirban Nag 'tintinmj'

@ AnirbanNag'tintinmj 'Якщо ви просто хочете розшифрувати сертифікат, спробуйтеopenssl x509 -in file.crt -noout -text
derobert

Я хочу, щоб вміст проміжного продукту в корені cert, який знаходиться між BEGINі ENDтегом.
Anirban Nag 'tintinmj'

Або якщо ви можете дати команду, яка витягне проміжну та кореневу cert з первинного cert та збереже це у файл ... Я можу також жити з цим.
Anirban Nag '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 етапи

Щоб скинути всі серти в ланцюзі до поточного dir як 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

Чи є якась причина вибрати ".pem" проти ".crt" як розширення, оскільки ви лише перейменовуєте їх, не змінюючи формат?
Людина капітана

Ні, не дуже. ".pem" - це формат (base64 DER) ".crt" означає, що це сертифікат, але нічого не говорить про кодування. Я збирався зробити це більш послідовним і назвати всі pem ... Але я вважаю, що простіше прочитати в одному вкладиші, щоб зрозуміти, куди завантажується сертифікат (crt), і закінчити те, що я зазвичай використовую у світі Linux (pem) . Сподіваюсь, це трохи прояснює речі ...
estani

1
Так, так, я розумію, що PEM - це формат, але я часто бачу crt і не знаю, чи це формат. Це насправді допомагає пояснити, чому я так часто бачу "crt". Дякую :)
Людина капітана

Здається, це працює лише в тому випадку, якщо ви вже довіряєте джерелу. Я намагаюся завантажити спеціальний CA, але завантажую лише перший сертифікат, а не ланцюжок.
mjaggard

@mjaggard дивно, оскільки я використовував його саме для цього випадку. При цьому сервер може взагалі не надсилати кореневий CA, якщо ви подивіться на мій приклад, він завантажував 3 серти, зараз він завантажує лише 2. Я припускаю, що сервер wikipedia не надсилає корінь (насправді немає пункт, якщо у вас його немає, ви все одно не будете йому довіряти ...). Я впевнений, що раніше це було не так.
Естані
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.