証明書バンドルの.crtファイルがあります。
openssl x509 -in bundle.crt -text -noout
はルート証明書のみを表示します。
他のすべての証明書を確認するにはどうすればよいですか?
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は、キーストア内の最初の証明書のみを読み取り、組み込みの証明書ストアからトラストチェーンを自動的に拡張します。
結果:
.crt
ファイルの最初の証明書以外は表示されません.crt
ファイルとは異なるトラストチェーンが表示される場合があります。これは誤った結論につながる可能性があります。次の この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;
ファイル内のすべての証明書の概要を表示するワンライナー。
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
これは美しくもエレガントでもないかもしれませんが、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オプションを調整することができます。これにはもっとエレガントな解決策があったらいいのにと思いますが、この場合、エレガントな解決策を見つけるのに、洗練されていない解決策を見つけるよりも時間がかかると思います。
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番目のコマンドは、抽出された証明書をループして表示します。
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
ここで慣用的な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番目の証明書を取得できます。
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
以下は、中間ファイルに依存しない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に渡されます。