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


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

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

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


76
2018-04-23 18:15






答案:


http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587 建议这个单线:

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

它确实对我有用,但我不明白细节所以不能说是否有任何警告。


88
2018-04-25 06:27



这是最好的答案 - 我甚至不会发布我的过度杀死Python解决方案!省略“-text”以获取每个证书的主题/发行者信息。 - Chris Wolf
尝试过 /etc/ssl/certs/ca-certificates.crt 得到了 unable to load PKCS7 object - OrangeDog
这不是pkcs7格式,而问题是关于x509格式捆绑? - Yetanotherjosh
它只使用pkcs7作为中间体。输入是连接的PEM。 - Beni Cherniavsky-Paskin
你很棒!!! - Jingguo Yao


以下 这个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 <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;

20
2018-03-27 13:29





Java的 keytool 诀窍:

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

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

结果:

  1. 超越了第一个证书 .crt 文件未显示
  2. 你可能会得到一个不同于信用链的信任链 .crt 文件。这可能导致错误的结论。

17
2017-09-03 07:18



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


这可能不是很漂亮或优雅,但它很快就适用于我在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
2017-11-09 01:08





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


3
2018-04-19 06:55



awk中的打印重定向功能可以用gawk和nawk获得,但不能用于基本的awk。所以,这将适用于Linux(gawk链接为awk),但可能不适用于具有基本awk的OS X. - Raghu Dodda


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

3
2017-09-23 09:21



这需要更好的解释 - Sven♦


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

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

1
2017-10-23 00:59





对MadHatter帖子的小改动,允许您直接复制/粘贴到CLI。我还包括MD5哈希,这在确保证书正确时很有用。返回的stdin行是cert(s)的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
2018-02-08 09:18