使用 OpenSSL CLI 从 x509 证书获取链或 CA 颁发者
Get chain or CA issuer from x509 certificate using OpenSSL CLI
我正在尝试使用 OpenSSL 从证书构建一个链(或者只是从某个地方获取它),最好使用命令行界面。
我在网上找到了一些例子,但我一直卡在这个问题"Where do I get the CA issuer from the certificate?"
例如查看这个网站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
- issuer=C = US, O = Google Trust Services, 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
但是 google,我不知道如何使用 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 并创建链。
似乎网上很多例子都提到了SSL证书。在 SSL 证书中,您只需连接到网站并下载完整的链。我认为服务器应该在 SSL 协议本身中为您提供完整的链。
我是为 SMIME 证书做的,这就是我感到困惑的原因,因为我不能使用他们用于 SSL 证书的相同方法。
在与我的同事交谈并将我所做的与在互联网上找到的一些类似程序进行比较之后,AIA 扩展似乎是正确的方法。也许它在X509标准中不是强制性的,但它似乎被广泛使用(我从未见过没有AIA扩展名的SMIME证书)。
然后,我手动创建链,返回使用 AIA 扩展名,直到找到没有此类扩展名的证书。
此时,那应该是一个根证书,我将尝试使用机器中安装的证书来验证它。
(当然不要忘记通过CRL或OCSP查看吊销状态)
到目前为止,一切正常:)
知道这有点老了,它已经解决了,但我想我会添加一个我写的小脚本来从 x509 输出中解析出 CA 颁发者:
getcaissuer() {
openssl x509 -noout -text -in | awk '/^[ \t]+CA Issuers[ \t]+-[ \t]+URI:/ { print gensub(/^.*URI:(.*)$/,"\1","g",[=10=]); }'
}
# usage: getcaissuer <certificate>
我正在尝试使用 OpenSSL 从证书构建一个链(或者只是从某个地方获取它),最好使用命令行界面。
我在网上找到了一些例子,但我一直卡在这个问题"Where do I get the CA issuer from the certificate?"
例如查看这个网站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
- issuer=C = US, O = Google Trust Services, 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
但是 google,我不知道如何使用 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 并创建链。
似乎网上很多例子都提到了SSL证书。在 SSL 证书中,您只需连接到网站并下载完整的链。我认为服务器应该在 SSL 协议本身中为您提供完整的链。
我是为 SMIME 证书做的,这就是我感到困惑的原因,因为我不能使用他们用于 SSL 证书的相同方法。
在与我的同事交谈并将我所做的与在互联网上找到的一些类似程序进行比较之后,AIA 扩展似乎是正确的方法。也许它在X509标准中不是强制性的,但它似乎被广泛使用(我从未见过没有AIA扩展名的SMIME证书)。
然后,我手动创建链,返回使用 AIA 扩展名,直到找到没有此类扩展名的证书。
此时,那应该是一个根证书,我将尝试使用机器中安装的证书来验证它。
(当然不要忘记通过CRL或OCSP查看吊销状态)
到目前为止,一切正常:)
知道这有点老了,它已经解决了,但我想我会添加一个我写的小脚本来从 x509 输出中解析出 CA 颁发者:
getcaissuer() {
openssl x509 -noout -text -in | awk '/^[ \t]+CA Issuers[ \t]+-[ \t]+URI:/ { print gensub(/^.*URI:(.*)$/,"\1","g",[=10=]); }'
}
# usage: getcaissuer <certificate>