web-dev-qa-db-ja.com

Linuxの証明書チェーンからルートCAおよび下位CAを抽出する方法

中間証明書とルート証明書を持つエンドエンティティ/サーバー証明書があります。エンドエンティティ証明書でcatを使用すると、BEGINタグとENDタグが1つだけ表示されます。これが唯一のエンドエンティティ証明書です。

中間証明書とルート証明書の内容を表示する方法はありますか? BEGINおよびENDタグのコンテンツのみが必要です。

Windowsでは、「Certification Path」から完全な証明書チェーンを確認できます。以下は、Stack Exchangeの証明書の例です。

enter image description here

そこからView Certificateを実行してエクスポートできます。 Windowsでは、ルートと中間の両方でそれを行うことができます。 Linuxでこれと同じ方法を探しています。

enter image description here

Webサイトから、次のことができます。

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

これにより、サーバーが提示した証明書チェーンとすべての証明書が表示されます。

ここで、これら2つの証明書をファイルに保存すると、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は検証する証明書です。 depth = 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

その「CA発行者」URIは中間証明書(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のシステムルートCAストアで検索できます(名前に.0を追加するだけです)。

私はあなたのためにそれをすべて行う素敵で簡単なOpenSSLコマンドがあるとは思いません。

32
derobert

tl; dr-チェーン内のすべての証明書をダンプする1つのライナーbashマジック

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
22
estani

オプション-verify 5 opensslは、証明書の展開に含まれていないものも含めて、すべての証明書を示すチェーンの奥深くまで進んでいます。

証明書で提供されているチェーンを本当に理解したい場合は、次を実行する必要があります。

openssl s_client -showcerts -partial_chain -connect YOUR_ENDPOINT:443 < /dev/null |less
1
Alex