我有一个证书包.crt文件。
做openssl x509 -in bundle.crt -text -noout
只显示根证书。
我如何看到所有其他证书?
http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587build议这个单行:
openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -text -noout
它确实为我工作,但我不明白的细节,所以不能说,如果有任何警告。
在这个FAQ之后,我得到了这个perl脚本 , 这个脚本非常强烈地暗示了openssl
没有本地支持来处理bundle中的第 n 个证书,相反,我们必须使用一些工具在input之前对input进行切片每个证书openssl
。 这个perl脚本,可以从Nick Burch的脚本中自由调整,似乎可以胜任:
#!/usr/bin/perl # script for splitting multi-cert input into individual certs # Artistic Licence # # v0.0.1 Nick Burch <[email protected]> # v0.0.2 Tom Yates <[email protected]> # $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;
Java的keytool
做到这一点:
keytool -printcert -v -file <certs.crt>
注释: Windows doubleclick不起作用。 Windows只读取密钥库中的第一个证书,并自动将信任链从其内置的证书存储扩展。
结果:
.crt
文件中的第一个证书之外的所有内容都不显示 .crt
文件中的信任链。 这可能会导致错误的结论。 这可能不是很漂亮或者很好,但是在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选项来适应。 我真的希望有一个更优雅的解决scheme,但在这种情况下,我认为寻找更优雅的解决scheme将需要更多的时间比黑客不雅。
由于没有基于awk的解决scheme:
$ 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行将数据包拆分为证书。 第二个命令遍历提取的证书并显示它们。
在bash中通常只需要一行(长)代码:-)
tfile=$( mktemp -u ) && \ csplit -z -q -f "$tfile" bundle.crt '/----BEGIN CERTIFICATE-----/' '{*}' && \ find "${tfile%/*}" -name "${tfile##*/}*" -exec openssl x509 -noout -subject -in "{}" \; -delete
对MadHatter的post做了小小的改动,让你直接复制/粘贴到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你可以使用。 与第一个相同的东西,但只是pipeegrep。
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购物者 – 证书关键匹配器
这是一个基于awk的解决scheme,不依赖于中间文件。
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。
你可以看到整个链的一种方法(当然是在Windows中)双击crt,然后在“authenticationpath”选项卡上查看。 它将显示整个链,即使只有中级或根证书。 有关详细信息,请参阅下面的截图 如果你不在Windows上,我对于我在Unix / Linux版本中缺乏知识表示歉意。
注意:如果中间证书位于本地密钥库中,这可能会导致错误的结果,Windows会自动添加它,而不是仅显示包中的内容。
我忽略了你最初的命令,你有一个不合适的地方。 你的命令应该是这样的:
openssl x509 -in bundle.crt -noout -text
资料来源: http : //manpages.ubuntu.com/manpages/hardy/man1/x509.1ssl.html