バンドル内のすべてのSSL証明書を表示する方法は?


102

証明書バンドルの.crtファイルがあります。

実行openssl x509 -in bundle.crt -text -nooutすると、ルート証明書のみが表示されます。

他のすべての証明書を表示するにはどうすればよいですか?

回答:


121

http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587は、このワンライナーを提案しています

openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -text -noout

それは実際に私のために働いたが、私は詳細を理解していないので、警告があるかどうか言うことはできません。


9
これが最良の答えです-私は自分のやりすぎのPythonソリューションさえ投稿しません!「-text」を省略して、各証明書の件名/発行者情報を取得します。
クリスウルフ

それを試着/etc/ssl/certs/ca-certificates.crtして得たunable to load PKCS7 object
OrangeDog

1
これはpkcs7形式ではありませんが、質問はx509形式のバンドルに関するものですか?
イエタノザージョシュ

3
pkcs7を中間としてのみ使用します。入力は連結PEMです。
ベニチェルニアフスキーパスキン

君は最高だ!!!
静国八尾

21

Java keytoolはトリックを行います:

keytool -printcert -v -file <certs.crt>

注釈: Windowsダブルクリックは機能しません。Windowsは、キーストア内の最初の証明書のみを読み取り、組み込みの証明書ストアからトラストチェーンを自動的に拡張します。

結果:

  1. .crtファイルの最初の証明書以外はすべて表示されません
  2. .crtファイルにあるものとは異なるトラストチェーンが表示される場合があります。これは間違った結論につながる可能性があります。

Windowsのことを明確にしてくれてありがとう。これは本当に私の地獄を混乱させた
Nick.McDermaid

21

このFAQに続いてこのperlスクリプトに至り、バンドル内openssln 番目の証明書を処理するためのネイティブサポートがなく、代わりに各ツールを使用して入力をスライスアンドダイスする必要があることを強く示唆していますへの証明書openssl。上にリンクされたNick Burchのスクリプトから自由に改造されたこのperlスクリプトは、仕事をするようです:

#!/usr/bin/perl
# script for splitting multi-cert input into individual certs
# Artistic Licence
#
# v0.0.1         Nick Burch <nick@tirian.magd.ox.ac.uk>
# v0.0.2         Tom Yates <tyates@gatekeeper.ltd.uk>
#

$filename = shift;
unless($filename) {
  die("You must specify a cert file.\n");
}
open INP, "<$filename" or die("Unable to load \"$filename\"\n");

$thisfile = "";

while(<INP>) {
   $thisfile .= $_;
   if($_ =~ /^\-+END(\s\w+)?\sCERTIFICATE\-+$/) {
      print "Found a complete certificate:\n";
      print `echo \'$thisfile\' | openssl x509 -noout -text`;
      $thisfile = "";
   }
}
close INP;

10

ファイル内のすべての証明書の要約を表示するOneliner。

openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -noout

(他の回答で言及された同様のコマンドーですが、これは--textオプションなしでより短い出力を提供します)。

例:

$ openssl crl2pkcs7 -nocrl -certfile bundled.crt | openssl pkcs7 -print_certs -noout

subject=/C=NL/postalCode=5705 CN/L=City/street=Example 20/O=Foobar B.V./OU=ICT/OU=Wildcard SSL/CN=*.example.com
issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA

subject=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority

subject=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
issuer=/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Roo

これには、より良い説明が必要です
スヴェン

3

これはきれいでもエレガントでもないかもしれませんが、Linuxでbashを使用し、ca-certバンドルファイルでPEM形式のブロックを使用することで迅速に機能しました。

while read line
do
    if [ "${line//END}" != "$line" ]; then
        txt="$txt$line\n"
        printf -- "$txt" | openssl x509 -subject -issuer -noout
        txt=""
    else
        txt="$txt$line\n"
    fi
done < /path/to/bundle/file

それをすべて1行に入れて、opensslオプションを調整してください。もっとエレガントな解決策があればいいのですが、この場合、エレガントな解決策を見つけるには、洗練されていないものをハックするよりも時間がかかると思います。


3

awkベースのソリューションがないため:

$ cat ca-bundle | awk '/BEGIN/ { i++; } /BEGIN/, /END/ { print > i ".extracted.crt" }'
$ ls *.extracted.crt | while read cert; do openssl x509 -in $cert -text -noout; done

最初のコマンドは、BEGINおよびEND行を探すことにより、バンドルを証明書に分割します。2番目のコマンドは、抽出された証明書をループして表示します。


1
awkの印刷リダイレクト機能はgawkとnawkで利用できますが、基本的なawkでは利用できません。したがって、これはLinux(gawkはawkとしてリンクされます)では機能しますが、基本的なawkを備えたOS Xでは機能しない可能性があります。
ラグードッダ

1

bashでは通常、必要なコードは1行(長い)だけです:-)

tfile=$( mktemp -u ) && \
csplit -z -q -f "$tfile" bundle.crt  '/----BEGIN CERTIFICATE-----/' '{*}' && \
find "${tfile%/*}" -name "${tfile##*/}*" -exec openssl x509 -noout -subject -in "{}" \; -delete

0

MadHatterの投稿を少し変更して、CLIに直接コピー/貼り付けできるようにします。また、証明書が正しいことを確認するときに役立つMD5ハッシュも含めました。返されるstdin行は、証明書のmd5ハッシュです。

perl -e 'my $thisfile = "";
foreach (<>) {
   $thisfile .= $_;
   if($_ =~ /^\-+END(\s\w+)?\sCERTIFICATE\-+$/) {
      print "Found a complete certificate:\n";
      print `echo "$thisfile" | openssl x509 -noout -text`;
      print `echo "$thisfile" | openssl x509 -noout -modulus | openssl md5`;
      $thisfile = "";
   }
}' < my_id_cert_and_ca_bundle.crt

簡潔で簡潔な出力を表示する場合は、このバージョンを使用します。すべての証明書が含まれていることを確認するだけで、証明書の使用法などを実際に確認しない場合に役立ちます。

perl -e 'my $thisfile = "";
foreach (<>) {
   $thisfile .= $_;
   if($_ =~ /^\-+END(\s\w+)?\sCERTIFICATE\-+$/) {
      print "Found a complete certificate:\n";
      print `echo "$thisfile" | openssl x509 -noout -serial -subject -dates -alias -issuer`;
      print `echo "$thisfile" | openssl x509 -noout -modulus | openssl md5` . "\n";
      $thisfile = "";
   }
}' < my_id_cert_and_ca_bundle.crt

opensslバージョンがこれらのフラグをすべてサポートしていない場合に備えて、使用できるegrepがあります。最初のものと同じですが、egrepにパイプするだけです。

perl -e '.....
' < my_id_cert_and_ca_bundle.crt | egrep "Serial|Subject:|Not |Public-Key|^Cert|stdin|ssuer"

秘密鍵のMD5ハッシュを確認するには、次を実行できます。

openssl rsa -noout -modulus -in privateKey.key | openssl md5

参照:SSLショッパー-証明書キーマッチャー


0

中間ファイルに依存しないawkベースのソリューションを次に示します。

cat bundle.crt | awk '{
  if ($0 == "-----BEGIN CERTIFICATE-----") cert=""
  else if ($0 == "-----END CERTIFICATE-----") print cert
  else cert=cert$0
}' | while read CERT; do
  echo "$CERT" | base64 -d | openssl x509 -inform DER -text -noout
done

stdinからPEMブロックを読み取り、各ブロックを単一のbase64エンコード行に連結することで機能します。次に、行が読み取られ、デコードされ、DERエンコードされた証明書としてopensslに渡されます。


2
楽しみのために:cat bundle.crt | awk -v cmd="openssl x509 -subject -noout" '/-----BEGIN/ { c = $0; next } c { c = c "\n" $0 } /-----END/ { print c|cmd; close(cmd); c = 0 }'
マナヴ

0

ここで慣用的なperlコマンドラインを投入したいと思います。

  perl -ne "\$n++ if /BEGIN/; print if \$n == 1;" mysite.pem

テキストがある場合、わずかに堅牢な微調整:

 perl -ne "\$n++ if /^-----BEGIN CERTIFICATE-----\$/; print if \$n == 3 && /^-----BEGIN CERTIFICATE-----\$/.../^-----END CERTIFICATE-----\$/;" mysite.pem

2番目のステートメントのnの値を変更して、n番目の証明書を取得します。


-2

Windowsメソッド

チェーン全体を表示する1つの方法は、(もちろんWindowsで)crtをダブルクリックして、[証明書のパス]タブを確認することです。中間証明書またはルート証明書のみがある場合でも、チェーン全体が表示されます。詳細については、以下のスクリーンショットをご覧ください。Windowsを使用していない場合は、Unix / Linuxバリアントに関する知識が不足していることをおaびします。

注:中間証明書がローカルキーストアにある場合、これにより誤った結果が発生する可能性があります。Windowsは自動的に追加し、バンドルにあったものだけを表示しません。

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

Linux(Ubuntuメソッド)

私はあなたの最初の命令を見落としました、そしてあなたは場違いなものを一つ持っています。コマンドは次のようになります。

openssl x509 -in bundle.crt -noout -text

ソース:http : //manpages.ubuntu.com/manpages/hardy/man1/x509.1ssl.html


本当に?私はそれがsublteであることを知っていますが、あなたは本当にわかりませんか?私はopenssl x509 -in bundle.crt -noout -textですが、あなたのものは-text -nooutを持っています...したがって、おそらく構文エラーが発生する可能性があります。
ブラッドブシャード14

20
ブラッド、馬を抱えて。まず、OPは彼のopenssl呼び出しが構文エラーを与えたことには文句を言いませんでしたが、バンドルの最初の証明書のみをリストしました。次に、2つの呼び出しは機能的に同じです。第三に、そしておそらく最も重要なことには、少なくとも私にとっては、あなたのものも機能しません。また、バンドル内の最初の証明書のみがリストされます。
マッドハッター14

ええ、私はこのような問題についてUbuntu側のことではなく、別のことを言うまではWindowsにいると思っていました。だから私はOPをぶら下げたままにしたくありませんでしたが、少し検索した後、これらのタイプのコマンドのリファレンスサイトが私が与えたコマンド(わずかに異なる構文を持つもの)をリストし、それができるかどうかを確認したかった助けて。あなたのポイントは取られますが、次回はもっと優雅にそれをしてください。
ブラッドブシャード14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.