首页 > 解决方案 > 叶证书上的证书链验证失败

问题描述

我使用 生成了 PEM 证书链(CA、中间和叶)pyopenssl,并且我想确认我正确定义了所有内容。

以下是我采取的步骤:

  1. 我制作了三个 PEM 证书,对 CA 进行了自签名,并在这个问题crypto.X509Extension(b'basicConstraints', False, b'CA:TRUE')之后定义了基本约束
  2. 我将 CA 和中间证书复制到/usr/local/share/ca-certificates(作为 crt 文件)并运行sudo update-ca-cert
  3. 我已经基于这个 OpenSSL 示例设置了一个简单的服务器
  4. 我尝试使用 CA 证书运行服务器并执行openssl s_client -connect localhost:4433 -CApath /etc/ssl/certs- 效果很好,得到了Verify return code: 0 (ok)
  5. 做了同样的事情,但这次服务器使用了中间证书 - 也很棒,Verify return code: 0 (ok)
  6. 做了同样的事情,但这次服务器使用了叶子证书 - 这次我得到了Verify return code: 24 (invalid CA certificate)

此外,我尝试验证证书并获得以下信息:

$ openssl verify 1-ca.pem
1-ca.pem: OK
$ openssl verify 2-intermediate.pem
2-intermediate.pem: OK
$ openssl verify 3-leaf.pem
C = NL, ST = Amsterdam, L = Zaandam, O = FakeDigiCert, OU = FakeFake, CN = www.fakedigicert.nl
error 24 at 1 depth lookup: invalid CA certificate
error 3-leaf.pem: verification failed

为什么服务器证书离CA多一步后CA证书突然失效?

标签: sslopensslssl-certificatepyopenssl

解决方案


这似乎是大多数人一直陷入设置 https Web 服务器的常见陷阱。您还需要向 Web 服务器提供所有中间证书(通常通过将叶子和中间 pem 文件合并到一个 pem 文件中)。因此,当 Web 浏览器访问您的站点时,SSL 设置应从 Web 服务器返回叶证书和中间证书。

当您将 -showcerts 选项与 opensll s_client命令一起使用时,您可以在所有提供中间证书的网站上看到这一点:

openssl s_client -connect www.example.com:443 -showcerts

openssl verify命令也是如此。

从文档:

- 不受信任的文件

用于构建从主题证书到信任锚的证书链的附加不受信任证书(中间颁发者 CA)的文件。该文件应包含一个或多个 PEM 格式的证书。可以多次指定此选项以包含来自多个文件的不受信任的证书。

因此,在您上面的示例中,您需要执行以下操作:

openssl verify 3-leaf.pem -untrusted 2-intermediate.pem

推荐阅读