Linuxの証明書チェーンからルートCAと下位CAを抽出する方法は?


25

中間証明書とルート証明書を持つエンドエンティティ/サーバー証明書があります。とき私は、catエンドエンティティ証明書に、私は、単一の参照BEGINENDタグを。これは唯一のエンドエンティティ証明書です。

中間証明書とルート証明書のコンテンツを表示する方法はありますか?私だけの内容必要BEGINENDタグを。

Windowsでは、「認証パス」から完全な証明書チェーンを見ることができます。以下は、Stack Exchangeの証明書の例です。

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください


その証明書の発行者を教えてください。
ルイFリベイロ

@RuiFRibeiro誰でも言いましょう...プライマリー証明書のみを手にしたスタックエクスチェンジの証明書チェーンを見たいです。
アニルバンナグ 'tintinmj'

回答:


25

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するとgetを取得します244b5494。これは、システムルートCAストアで検索できます/etc/ssl/certs/244b5494.0.0名前に追加するだけです)。

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


それが主な問題です。URLがありません。証明書ファイルしかありません。そしてBEGINENDタグとタグの間に暗号化されたコンテンツが必要です(cat.crtファイルを実行すると取得されます)
Anirban Nag 'tintinmj'

@ AnirbanNag'tintinmj '証明書をデコードするだけの場合は、試してくださいopenssl x509 -in file.crt -noout -text
derobert

私は間にあるルート証明書での中間のコンテンツたいBEGINENDタグを。
アニルバンナグ 'tintinmj'

または、プライマリ証明書から中間証明書とルート証明書を抽出し、それをファイルに保存するコマンドを提供できれば...
アニルバンナグ 'tintinmj'

@ AnirbanNag'tintinmj ' openssl x509コマンドで表示されない場合、中間証明書は存在しないと思います。(からエラーが発生しない限りopenssl x509)。
デロバート

12

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

拡張子として「.pem」と「.crt」を選択する理由はありますか。形式を変更せず、名前を変更するだけです。
キャプテンマン

いいえ、そうでもありません。「.pem」は形​​式(DERのbase64)です。「。crt」は証明書であることを意味しますが、エンコードについては何も伝えません。私はそれをもっと一貫させ、すべての名前を付けようとしました...しかし、証明書がダウンロードされている場所(crt)を理解し、Linuxの世界で通常使用しているもの(pem)を完了するために1つのライナーを読む方が簡単だと思います。希望この明確化物事ビット...
estani

1
はい、PEMはフォーマットであることがわかりますが、crtがよく表示され、フォーマットであるかどうかはわかりませんでした。これは、実際に「crt」が頻繁に使用される理由を説明するのに役立ちます。ありがとう:)
キャプテンマン

これは、すでにソースを信頼している場合にのみ機能するようです。カスタムCAをダウンロードしようとしていますが、チェーンではなく、最初の証明書のみをダウンロードしています。
mjaggard

@mjaggardは、その場合に正確に使用したため、奇妙です。つまり、サーバーはルートCAをまったく送信していない可能性があります。私の例を見てみると、3つの証明書をダウンロードしていましたが、現在は2つしかダウンロードされていません。ポイント、あなたがそれを持っていない場合、あなたはとにかくそれを信頼しません...)。以前はそうではなかったと確信しています。
エスタニ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.