web-dev-qa-db-ja.com

バンドル内のすべてのSSL証明書を表示するにはどうすればよいですか?

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

openssl x509 -in bundle.crt -text -nooutはルート証明書のみを表示します。

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

118
pdeva

http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587 は、この1行を示唆しています。

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

確かにうまくいきましたが、詳細がわからないので注意点はありません。

Javaのkeytoolがトリックを実行します。

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

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

結果:

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

次の このFAQこのPerlスクリプト に私を導きました、これはopensslが 番目 バンドル内の証明書。代わりに、各証明書をopensslに送る前に、いくつかのツールを使用して入力をスライスしてダイスする必要があります。このPerlスクリプトは、上記にリンクされたNick Burchのスクリプトから自由に改変されたもので、次のように機能します。

#!/usr/bin/Perl
# script for splitting multi-cert input into individual certs
# Artistic Licence
#
# v0.0.1         Nick Burch <[email protected]>
# v0.0.2         Tom Yates <[email protected]>
#

$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;
22
MadHatter

ファイル内のすべての証明書の概要を表示するワンライナー。

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
15
harmv

これは美しくもエレガントでもないかもしれませんが、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オプションを調整することができます。これにはもっとエレガントな解決策があったらいいのにと思いますが、この場合、エレガントな解決策を見つけるのに、洗練されていない解決策を見つけるよりも時間がかかると思います。

4
user2856925

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番目のコマンドは、抽出された証明書をループして表示します。

3
Raghu Dodda

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
2
Marco

ここで慣用的なPerlコマンドラインを投入します。

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

テキストがある場合は、もう少し堅牢なTweak:

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

2番目のステートメントでnの値を変更するだけで、n番目の証明書を取得できます。

1
Gerard ONeill

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 Shopper-Certificate Key Matcher

0
lavermil

以下は、中間ファイルに依存しない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

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

0
Joe