如何从Linux的证书链中提取根CA和从属CA?


25

我有一个具有中间证书和根证书的终端实体/服务器证书。当我cat使用最终实体证书时,只能看到一个BEGINEND标签。这是唯一的最终实体证书。

有什么办法可以查看中间证书和根证书的内容。我只需要BEGINEND标签的内容。

在Windows中,我可以从“证书路径”中看到完整的证书链。以下是Stack Exchange证书的示例。

在此处输入图片说明

从那里,我可以执行查看证书并将其导出。我可以在Windows中同时针对root用户和中级用户执行此操作。我正在Linux中寻找相同的方法。

在此处输入图片说明


请告诉我们是谁颁发的证书。
Rui F Ribeiro

@RuiFRibeiro可以说任何人...我想查看仅拥有主要证书的stackexchange的证书链。
Anirban Nag'tintinmj'17

Answers:


25

在网站上,您可以执行以下操作:

openssl s_client -showcerts -verify 5 -connect stackexchange.com:443 < /dev/null

这将显示证书链和服务器提供的所有证书。

现在,如果我将这两个证书保存到文件中,则可以使用openssl verify

$ openssl verify -show_chain -untrusted dc-sha2.crt se.crt 
se.crt: OK
Chain:
depth=0: C = US, ST = NY, L = New York, O = "Stack Exchange, Inc.", CN = *.stackexchange.com (untrusted)
depth=1: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert SHA2 High Assurance Server CA (untrusted)
depth=2: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA

-untrusted选项用于提供中间证书;se.crt是要验证的证书。depth = 2结果来自系统受信任的CA存储。

如果您没有中间证书,则无法执行验证。这就是X.509的工作方式。

根据证书的不同,它可能包含用于获取中间件的URI。例如,openssl x509 -in se.crt -noout -text包含:

        Authority Information Access: 
            OCSP - URI:http://ocsp.digicert.com
            CA Issuers - URI:http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt

该“ CA Issuers” URI指向中间证书(DER格式,因此您需要openssl x509 -inform der -in DigiCertSHA2HighAssuranceServerCA.crt -out DigiCertSHA2HighAssuranceServerCA.pem用于将其转换以供OpenSSL进一步使用)。

如果运行,openssl x509 -in /tmp/DigiCertSHA2HighAssuranceServerCA.pem -noout -issuer_hash则会得到244b5494,您可以在系统根CA存储中查找/etc/ssl/certs/244b5494.0(仅.0在名称后面)。

我认为没有一个简单易用的OpenSSL命令可以为您完成所有操作。


那是主要问题。我没有网址。我只有证书文件。我需要进行加密的内容BEGINEND标签(你只会得到之后cat荷兰国际集团的.crt文件。
Anirban纳格“tintinmj”

@ AnirbanNag'tintinmj'如果您只是想解密证书,请尝试openssl x509 -in file.crt -noout -text
derobert

我想要root证书中介于BEGINEND标签之间的中间内容。
Anirban Nag'tintinmj'17

或者,如果您可以提供一个从主要证书中提取中间证书和根证书并将其保存到文件中的命令,我也可以接受。
Anirban Nag'tintinmj'17

@ AnirbanNag'tintinmj'如果该openssl x509命令未显示,则我认为中间证书不存在。(除非您从中遇到一些错误openssl x509)。
德罗伯特

12

tl; dr-一种班轮bash魔术来丢弃链中的所有证书

openssl s_client -showcerts -verify 5 -connect de.wikipedia.org:443 < /dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".crt"; print >out}' && for cert in *.crt; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$/\1/; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done

分两步说明

要将链中的所有证书转储为当前目录,如下所示cert${chain_number}.pem

openssl s_client -showcerts -verify 5 -connect your_host:443 < /dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".pem"; print >out}' 

红利轨道将其重命名为通用名称:

for cert in *.pem; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$/\1/; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done

有什么理由选择“ .pem”和“ .crt”作为扩展名,因为您仅重命名它们,而不更改格式?
上尉曼

不,不是。“ .pem”是格式(DER的base64)。“。crt”表示它是证书,但是不告诉任何有关编码的信息。我打算使其更加一致并命名所有pem ...但是我认为更容易阅读本文,以了解证书的下载位置(crt)并完成我在Linux世界中通常使用的内容(pem) 。希望这
能使

1
是的,的确如此,我意识到PEM是一种格式,但是我经常看到crt,并且不确定它是否是一种格式。这实际上有助于解释为什么我看到“ crt”使用得如此频繁。谢谢:)
上尉

这似乎只有在您已经信任来源的情况下才有效。我正在尝试下载自定义CA,但它只是下载第一个证书,而不是链。
mjaggard

@mjaggard很奇怪,因为我正是在这种情况下使用它的。话虽这么说,该服务器可能根本没有发送根CA,如果您看一下我的示例,它曾经下载了3个证书,现在仅下载了2个证书。我认为Wikipedia服务器没有发送根证书(实际上没有一点,如果您没有它,您将永远不会信任它...)。我很确定以前不是这种情况。
estani
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.