我有一个证书捆绑包.crt文件。

执行openssl x509 -in bundle.crt -text -noout仅显示根证书。

我如何查看所有其他证书?

#1 楼

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

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


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

评论


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

–克里斯沃尔夫
16-3-28在23:03

在/etc/ssl/certs/ca-certificates.crt上进行了尝试,无法加载PKCS7对象

–橙色狗
17年6月30日在13:48

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

– Yetanotherjosh
18年2月8日在2:16

它仅使用pkcs7作为中间对象。输入是连接的PEM。

–贝尼(Beni Cherniavsky)-帕斯金(Paskin)
18年2月8日在7:00

为了后代的利益,它是“ CRL 2”,而不是“ CR 12”-crl2pkcs7

–加文·扬西(Gavin S. Yancey)
19/12/3在23:01

#2 楼

Java的keytool可以解决这个问题:

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


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

结果:


.crt文件未显示
您可能会显示与.crt文件中不同的信任链。这可能会导致错误的结论。


评论


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

– Nick.McDermaid
17年12月8日在5:17

#3 楼

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


#4 楼

Oneliner显示文件中每个证书的摘要。
openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -noout

(类似于serverfault.com/a/755815/27515,但是给出的输出较短,没有--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
18年4月19日在9:09

...例如这与serverfault.com/a/755815/27515有何不同

–幼虫
20-10-8在10:20



@larsks除了没有-text标志外,其他都是一样的。这样,它吐出的信息更少(大多数信息可能对您没有用)

–JelteF
20 Nov 23在14:25



#5 楼

这可能不漂亮,也不是优雅,但是它很快并且对我有效,在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选项以适合。我真的希望有一个更优雅的解决方案,但是在这种情况下,我认为找到一种更优雅的解决方案要比破解不雅致的解决方案花费更多的时间。

#6 楼

由于没有基于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行将包分成证书。第二个命令循环遍历提取的证书并显示它们。

评论


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

–拉格·道达(Raghu Dodda)
2015年11月9日,下午1:34

#7 楼

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

tfile=$( mktemp -u ) && \
csplit -z -q -f "$tfile" bundle.crt  '/----BEGIN CERTIFICATE-----/' '{*}' && \
find "${tfile%/*}" -name "${tfile##*/}*" -exec openssl x509 -noout -subject -in "{}" \; -delete


#8 楼

我想在这里输入惯用的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个证书。

#9 楼

对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购物者-证书密钥匹配器

#10 楼

这是一个基于awk的解决方案,它不依赖中间文件。

cat bundle.crt | awk '{
  if (q4312078q == "-----BEGIN CERTIFICATE-----") cert=""
  else if (q4312078q == "-----END CERTIFICATE-----") print cert
  else cert=certq4312078q
}' | 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;关闭(cmd); c = 0}'。

– Manav
16年5月30日在14:11

#11 楼

@ user1686在https://superuser.com/questions/1599666/view-all-certs-in-a-pem-cert-file-full-cert-chain-with-openssl-or-another-comm <中提出了另一种解决方案
它是GnuTLS堆栈的一部分。
certtool -i < multiplecerts.pem


#12 楼

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 ...因此,为什么您可能会遇到语法错误。

–布拉德·布查德(Brad Bouchard)
2014年4月25日在3:43

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

– MadHatter
14-4-25在5:57



是的,在类似这样的问题上,我对Ubuntu的看法不太满意,除非他告诉我否则他就一直在Windows上。因此,我不想让OP挂起,经过一番搜索之后,发现这些类型的命令的参考站点列出了我给他的命令(语法稍有不同的命令),并想知道是否可以救命。您的分数已被记录下来,但是下次请使用更多的宽限期。

–布拉德·布查德(Brad Bouchard)
2014年4月25日下午6:21