回答:
http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587は、このワンライナーを提案しています。
openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -text -noout
それは実際に私のために働いたが、私は詳細を理解していないので、警告があるかどうか言うことはできません。
/etc/ssl/certs/ca-certificates.crt
して得たunable to load PKCS7 object
Java keytool
はトリックを行います:
keytool -printcert -v -file <certs.crt>
注釈: Windowsダブルクリックは機能しません。Windowsは、キーストア内の最初の証明書のみを読み取り、組み込みの証明書ストアからトラストチェーンを自動的に拡張します。
結果:
.crt
ファイルの最初の証明書以外はすべて表示されません.crt
ファイルにあるものとは異なるトラストチェーンが表示される場合があります。これは間違った結論につながる可能性があります。このFAQに続いてこのperlスクリプトに至り、バンドル内openssl
のn 番目の証明書を処理するためのネイティブサポートがなく、代わりに各ツールを使用して入力をスライスアンドダイスする必要があることを強く示唆していますへの証明書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;
ファイル内のすべての証明書の要約を表示する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
これはきれいでもエレガントでもないかもしれませんが、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番目のコマンドは、抽出された証明書をループして表示します。
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
stdinからPEMブロックを読み取り、各ブロックを単一のbase64エンコード行に連結することで機能します。次に、行が読み取られ、デコードされ、DERエンコードされた証明書としてopensslに渡されます。
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 }'
。
ここで慣用的な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番目の証明書を取得します。
チェーン全体を表示する1つの方法は、(もちろんWindowsで)crtをダブルクリックして、[証明書のパス]タブを確認することです。中間証明書またはルート証明書のみがある場合でも、チェーン全体が表示されます。詳細については、以下のスクリーンショットをご覧ください。Windowsを使用していない場合は、Unix / Linuxバリアントに関する知識が不足していることをおaびします。
注:中間証明書がローカルキーストアにある場合、これにより誤った結果が発生する可能性があります。Windowsは自動的に追加し、バンドルにあったものだけを表示しません。
私はあなたの最初の命令を見落としました、そしてあなたは場違いなものを一つ持っています。コマンドは次のようになります。
openssl x509 -in bundle.crt -noout -text
ソース:http : //manpages.ubuntu.com/manpages/hardy/man1/x509.1ssl.html
openssl
呼び出しが構文エラーを与えたことには文句を言いませんでしたが、バンドルの最初の証明書のみをリストしました。次に、2つの呼び出しは機能的に同じです。第三に、そしておそらく最も重要なことには、少なくとも私にとっては、あなたのものも機能しません。また、バンドル内の最初の証明書のみがリストされます。