如何查看捆绑中的所有SSL证书?


Answers:


120

http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587建议使用这种单行代码:

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

它确实对我有用,但是我不了解细节,因此无法说是否有任何警告。


9
这是最好的答案-我什至不会发布我的过大的Python解决方案!省略“文本”以仅获取每个证书的主题/发行者信息。
克里斯·沃尔夫

就试了一下/etc/ssl/certs/ca-certificates.crt,得到了unable to load PKCS7 object
OrangeDog

1
这不是pkcs7格式吗,而问题是关于x509格式捆绑包?
Yetanotherjosh

3
它仅使用pkcs7作为中间对象。输入是串联的PEM。
贝尼·切尔尼亚夫斯基-帕斯金

你很棒!!!
姚敬国

21

Java的keytool诀窍是:

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

注释: Windows doubleclick不起作用。Windows仅读取密钥库中的第一个证书,并自动从其内置的证书库扩展信任链。

结果:

  1. 除了.crt文件中的第一个证书之外的所有内容都不会显示
  2. 您显示的信任链可能会与文件中显示的信任链不同.crt。这可能会导致错误的结论。

感谢您澄清窗户的事情。这真让我感到困惑
-Nick.McDermaid

21

遵循此常见问题解答后,我进入了这个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;

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

这需要更好的解释
Sven

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

您可以将所有内容放到一行,然后调整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行将包分成证书。第二个命令循环遍历提取的证书并显示它们。


1
aawk中的打印重定向功能在gawk和nawk中可用,但在基本awk中不可用。因此,这将在Linux(gawk被链接为awk)上工作,但可能在具有基本awk的OS X上无效。
Raghu Dodda 2015年

1

在bash中,通常只需要一行(长)代码:-)

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哈希,这在确保证书正确时非常有用。返回的标准输入行是证书的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

只需更改第二条语句中n的值即可获得第n个证书。


-2

Windows方法

可以看到整个链的一种方法是(当然是在Windows中)双击crt,然后查看“证书路径”选项卡。即使只有中级证书或根证书,它也会显示整个链。有关详细信息,请参见下面的屏幕截图。如果您不在Windows上,我对Unix / Linux变体的知识不足深表歉意。

注意:如果中间证书位于您本地的密钥库中,则这可能会导致错误的结果,Windows会自动添加该证书,而不会仅显示捆绑包中的内容。

                                      在此处输入图片说明

Linux(Ubuntu方法)

我忽略了您的最初命令,而您有一件事情不合时宜。您的命令应如下所示:

openssl x509 -in bundle.crt -noout -text

资料来源:http : //manpages.ubuntu.com/manpages/hardy/man1/x509.1ssl.html


真?我知道这很隐秘,但你真的不知道吗?我的是openssl x509 -in bundle.crt -noout -text,而您的是-text -noout ...因此,为什么您可能会遇到语法错误。
布拉德·布查德

20
抱住你的马,布拉德。首先,OP并没有抱怨他的openssl调用给出了语法错误,而是只列出了捆绑软件中的第一个证书。其次,这两个调用在功能上是相同的。第三,也许是最重要的一点,至少对于我来说,您的也不起作用。它也只列出捆绑软件中的第一个证书。
MadHatter 2014年

是的,在类似这样的问题上,我对Ubuntu的看法并不满意,除非他告诉我否则我认为他在Windows上。因此,我不想让OP挂起,经过一番搜索后发现,这些类型的命令的参考站点列出了我给他的命令(语法稍有不同的命令),并希望查看是否可以救命。您的分数已被记录下来,但是下次请更加宽容。
布拉德·布查德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.