为什么我无法验证该证书链?

为什么我无法验证该证书链?

我有一个链中的三个证书:

  • 根证书
  • 中间体.pem
  • 约翰·佩姆

当我使用它们检查它们时openssl x509 -in [filename] -text -noout,它们看起来很好,root.pem看起来像是自签名的(发行者==主题),并且每个证书的主题都是下一个证书的发行者,正如预期的那样。

事实上我可以验证中间证书链:

$ openssl verify -CAfile root.pem root.pem
root.pem: OK
$ openssl verify -CAfile root.pem intermediate.pem
intermediate.pem: OK

但是,john.pem 失败了:

$ openssl verify -CAfile root.pem -CAfile intermediate.pem john.pem
john.pem: C = CL, [...redacted data...]
error 2 at 1 depth lookup:unable to get issuer certificate

据我所知,这意味着 openssl 无法找到 middle.pem 的颁发者。这毫无道理,因为 root.pem 确实是 middle.pem 的颁发者。

我错过了什么?


编辑:我最初发布的答案说,root.pem 和 middle.pem 应该连接在一个文件中,然后应该使用这个文件作为 的参数-CAfile。这是错误的,因为这隐式地信任了 middle.pem,因为约翰内斯·皮勒指出。阅读他在我已删除的答案中发布的链接:https://mail.python.org/pipermail/cryptography-dev/2016-August/000676.html

答案1

您不必将这两个证书放在一起来验证它们。

假如你有以下三个证书:

  • root.pem-存储自签名证书。
  • middle.pem-存储由root.pem签名的证书
  • john.pem-存储由intermediate.pem签名的证书

并且您只信任 root.pem,那么您可以john.pem使用以下命令进行验证:

openssl verify -CAfile root.pem -untrusted intermediate.pem john.pem

如果你有很多中间体,你可以直接链接-untrusted intermediate2.pem -untrusted intermediate3.pem ...

答案2

@antiduh 所说的仅适用于单个中间证书的情况。在命令中添加多个证书-untrusted intermediate.pem似乎不起作用。不确定这是否与特定的 openssl 版本有关。

根据 openssl 文档:[https://linux.die.net/man/1/verify]

-不受信任的文件

不受信任的证书文件。该文件应包含多个证书

就我而言,我有一个如下的链: root.pem -> intermediate1.pem -> intermediate2.pem -> john.pem

通过将 cat middle1.pem & middle2.pem 放入单个 middle-chain.pem 文件中,然后运行,openssl verify -CAfile root.pem -untrusted intermediate-chain.pem john.pem对我来说是有效的。

似乎还需要设置 ca 扩展,basicConstraints = CA:true否则我仍然会遇到 openssl 验证报告错误。

相关内容