3

我正在尝试使用 OpenSSL 从证书构建一个链(或只是从某个地方获取它),最好使用命令行界面。

我在互联网上找到了一些示例,但我被困在“我在哪里可以从证书中获得 CA 颁发者?”的问题上。

例如查看这个网站openssl command cheatsheet,你会发现命令

openssl s_client -showcerts -host example.com -port 443

得到链子。您可以尝试使用www.google.com而不是example.com. 输出应该给你链。其他网站迟早会使用相同的命令...

因此,我无法直接从证书中获取链,但我应该在某个地方询问链。

现在我的问题是:我从哪里获得主机名,我可以在哪里发送我对链的请求?

我看了两个证书。

  1. stackexchange.com
  2. google.com

使用OpenSSL,我可以使用命令询问颁发者

openssl x509 -in certFile -noout -issuer

我分别得到

  1. issuer=C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
  2. 发行人=C = 美国,O = Google 信任服务,CN = GTS CA 1O1

老实说,我不知道如何处理这些结果......

然后,用命令调查

openssl x509 -text -in certFile

我找到了 AIA 扩展:

  1. CA 颁发者 - URI:http ://cert.int-x3.letsencrypt.org/
  2. CA 发行者 - URI: http: //pki.goog/gsr2/GTS1O1.crt

好的,在第一个例子中,我终于可以使用命令了

openssl s_client -showcerts -host http://cert.int-x3.letsencrypt.org/ -port 443

但是对于谷歌,我不知道如何使用openssl....我可以使用下载链wget,但我没有从 stackexchange 获得的相同格式...

所以,最后,我的问题:

  • 我应该如何处理这些差异?
  • 有没有更好的方法从证书中获取链,而不要求 CA 颁发者?
  • CA Issuer 是 AIA 的扩展,我认为它不是强制性的,我可以依赖它吗?
  • 如何在OpenSSL不自己解析输出的情况下使用 CA 颁发者?(类似openssl x509 -caIssuer -in certFile

PS:我最终尝试实现的是验证证书,遍历整个链,并检查链中每个证书的所有 OCSP 或 CRL ...如果您有 C++ 中的工作示例,或者只是使用 OpenSSL CLI,我将不胜感激 :)

编辑:

我现在正在做的是自己创建链。

使用 AIA 扩展,我获得 CA 颁发者 URI,下载 CA 颁发者证书(如果需要,转换为 PEM),依此类推,直到我不再找到 CA 颁发者。然后,可能它是一个根 CA。

之后,我手动收集所有 pem 并创建链。

4

2 回答 2

1

知道这有点旧并且已经解决,但我想我会添加一个我编写的小脚本来从 x509 输出中解析出 CA Issuer:

getcaissuer() {
openssl x509 -noout -text -in $1 | awk '/^[ \t]+CA Issuers[ \t]+-[ \t]+URI:/ { print gensub(/^.*URI:(.*)$/,"\\1","g",$0); }'
}

# usage:  getcaissuer <certificate>
于 2021-08-03T13:56:33.400 回答
0

互联网上的很多例子似乎都在考虑 SSL 证书。在 SSL 证书中,您只需连接到网站并下载完整的链。我认为服务器应该在 SSL 协议本身中为您提供完整的链。

我是为 SMIME 证书做的,这就是我感到困惑的原因,因为我不能使用他们用于 SSL 证书的相同方法。

在与我的同事交谈并将我正在做的事情与在互联网上找到的一些类似程序进行比较之后,似乎 AIA 扩展是正确的方法。也许它在 X509 标准中不是强制性的,但它似乎被广泛使用(我从未见过没有 AIA 扩展的 SMIME 证书)。

然后,我手动创建链,使用 AIA 扩展返回,直到找到没有此类扩展的证书。

此时,这应该是一个根证书,我将尝试使用机器中安装的证书来验证它。

(当然不要忘记通过CRL或OCSP查看撤销状态)

到目前为止,一切都运行良好:)

于 2020-02-25T09:28:24.630 回答