Answers:
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 doubleclick不起作用。Windows仅读取密钥库中的第一个证书,并自动从其内置的证书库扩展信任链。
结果:
.crt
文件中的第一个证书之外的所有内容都不会显示.crt
。这可能会导致错误的结论。遵循此常见问题解答后,我进入了这个perl脚本,该脚本强烈地向我表明,该语言openssl
不支持对捆绑中的第n 个证书进行处理,因此我们必须使用某种工具对输入进行切片和切块后再喂入每个证书给openssl
。这个perl脚本可以自由地改编自上面链接的Nick Burch的脚本,似乎可以做到:
#!/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
您可以将所有内容放到一行,然后调整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行将包分成证书。第二个命令循环遍历提取的证书并显示它们。
对MadHatter帖子的小改动,使您可以直接复制/粘贴到CLI。我还包括了MD5哈希,这在确保证书正确时非常有用。返回的标准输入行是证书的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 }'
。
可以看到整个链的一种方法是(当然是在Windows中)双击crt,然后查看“证书路径”选项卡。即使只有中级证书或根证书,它也会显示整个链。有关详细信息,请参见下面的屏幕截图。如果您不在Windows上,我对Unix / Linux变体的知识不足深表歉意。
注意:如果中间证书位于您本地的密钥库中,则这可能会导致错误的结果,Windows会自动添加该证书,而不会仅显示捆绑包中的内容。
我忽略了您的最初命令,而您有一件事情不合时宜。您的命令应如下所示:
openssl x509 -in bundle.crt -noout -text
资料来源:http : //manpages.ubuntu.com/manpages/hardy/man1/x509.1ssl.html
openssl
调用给出了语法错误,而是只列出了捆绑软件中的第一个证书。其次,这两个调用在功能上是相同的。第三,也许是最重要的一点,至少对于我来说,您的也不起作用。它也只列出捆绑软件中的第一个证书。