我正在尝试使用 OpenSSL 从证书构建一个链(或只是从某个地方获取它),最好使用命令行界面。
我在互联网上找到了一些示例,但我被困在“我在哪里可以从证书中获得 CA 颁发者?”的问题上。
例如查看这个网站openssl command cheatsheet,你会发现命令
openssl s_client -showcerts -host example.com -port 443
得到链子。您可以尝试使用www.google.com
而不是example.com
. 输出应该给你链。其他网站迟早会使用相同的命令...
因此,我无法直接从证书中获取链,但我应该在某个地方询问链。
现在我的问题是:我从哪里获得主机名,我可以在哪里发送我对链的请求?
我看了两个证书。
- stackexchange.com
- google.com
使用OpenSSL
,我可以使用命令询问颁发者
openssl x509 -in certFile -noout -issuer
我分别得到
- issuer=C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
- 发行人=C = 美国,O = Google 信任服务,CN = GTS CA 1O1
老实说,我不知道如何处理这些结果......
然后,用命令调查
openssl x509 -text -in certFile
我找到了 AIA 扩展:
- CA 颁发者 - URI:http ://cert.int-x3.letsencrypt.org/
- 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 并创建链。