使用 openssl 单独验证证书链的组件

信息安全 证书 openssl x.509
2021-08-10 21:16:18

这与另一个问题有关,如何使用 OpenSSL CLI 验证一个实体的签名?

我曾经openssl s_client -showcerts -connect www.google.com:443从谷歌收集三个证书。称他们为g0, g1, g2, 其中:

  • g0 是由 Google 的中间 CA 签署的叶子证书
  • g1 持有中间 CA 公钥并由 GeoTrust CA 签名
  • g2 持有 GeoTrust 公钥并由 EquiFax CA 签名

我的目标是使用 OpenSSL CLI 逐步证明这是一个有效的签名链。直观的尝试是这样的:

$ openssl verify -CAfile g1 g0

但事实证明,OpenSSL 正在使用来自其受信任存储的证书(请参阅如何使用 OpenSSL CLI 验证另一个实体的签名?)。因此,我杀死了受信任的商店,正如@dave_thompson_085 在对上述问题的评论中所建议的那样。但这似乎不起作用:

$ openssl verify -CApath /dev/null -CAfile g1 g0
g1.crt: C = US, O = Google Inc, CN = Google Internet Authority G2
error 2 at 1 depth lookup:unable to get issuer certificate

那么我如何正确地发出这个verify命令,以便我可以专门检查是否g1已签名g0

$ openssl version
OpenSSL 1.0.1f 6 Jan 2014
3个回答

我或多或少地解决了我的问题,如下所示:

有一个verify调用选项-partial_chain允许验证输出OK,而无需找到位于自签名可信根证书的链。但是,-partial_chain在我拥有的 OpenSSL 版本以及任何更高版本的 1.0.1 中都不存在。这是破败:

  • OpenSSL 1.0.1f——这是 Ubuntu 14.04 的最新版本;它有心脏出血修复
  • OpenSSL 1.0.1s——这是 1.0.1 系列中的最新版本,也可能是最后一个;必须在 Ubuntu 14.04 中手动安装
  • OpenSSL 1.0.2g -- 目前是 1.0.2 线中的最新版本;这确实支持-partial_chain
  • OpenSSL 1.1——目前处于 alpha 阶段,并且有更多选择,但我没有探索它

因此,可以使用1.0.2g或稍后执行以下操作:

$ openssl verify -CApath /dev/null -partial_chain -trusted g1 g0
g0: OK
$ openssl verify -CApath /dev/null -partial_chain -trusted g2 g1
g1: OK
$ openssl verify -CApath /dev/null -trusted /etc/ssl/certs/EquiFax_Secure_CA.pem g2
g2: OK

(请注意,-partial_chain由于 Equifax 根证书是自签名的,因此在最后一个命令中不需要。)

这满足了我的问题,但需要一个在某些发行版上尚不可用的 OpenSSL 版本,除非您手动安装。如果您坚持使用 1.0.2 之前的版本,您可能必须使用 @Anthony Geoghegan 的方法。

注意:根据我的测试,verify文档中列出了一个选项-no-CApath,据称它消除了对. -CApath /dev/null我假设它在 1.1 中可用。

OpenSSLverify命令建立一个完整的证书链(直到它到达一个自签名的 CA 证书)以验证证书。从它的手册页:

首先,从提供的证书开始构建证书链,并以根 CA 结束。如果无法建立整个链,则为错误。

如果它可以验证完整的链,它只会返回一个肯定的结果。

如果任何操作失败,则证书无效。

但是,以下命令结果提供了足够的信息来表明g0证书g1证书签名的。

$ openssl verify -CApath /dev/null -CAfile g1 g0
g1.crt: C = US, O = Google Inc, CN = Google Internet Authority G2
error 2 at 1 depth lookup:unable to get issuer certificate

错误 2表示无法找到链中的证书之一。

2 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:无法获得颁发者证书

找不到所查找证书的颁发者证书。这通常意味着受信任的证书列表不完整。

这里重要的是深度为 1。这表明被检查的证书在第一级进行了验证,深度 0(由g1证书)。

如果g1证书用于签署g0证书,则错误将出现在第一阶段,深度 0,您将收到错误 20

error 20 at 0 depth lookup:unable to get local issuer certificate

20 X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:无法获取本地颁发者证书

找不到颁发者证书:如果找不到不受信任的证书的颁发者证书,则会发生这种情况。

要验证发行人cert1.crtcert1Issuer.crt

openssl verify -no-CAfile -no-CApath -partial_chain -trusted cert1Issuer.crt cert1.crt
# cert1.crt : OK