ssl - 叶证书上的证书链验证失败
问题描述
我使用 生成了 PEM 证书链(CA、中间和叶)pyopenssl
,并且我想确认我正确定义了所有内容。
以下是我采取的步骤:
- 我制作了三个 PEM 证书,对 CA 进行了自签名,并在这个问题
crypto.X509Extension(b'basicConstraints', False, b'CA:TRUE')
之后定义了基本约束 - 我将 CA 和中间证书复制到
/usr/local/share/ca-certificates
(作为 crt 文件)并运行sudo update-ca-cert
- 我已经基于这个 OpenSSL 示例设置了一个简单的服务器
- 我尝试使用 CA 证书运行服务器并执行
openssl s_client -connect localhost:4433 -CApath /etc/ssl/certs
- 效果很好,得到了Verify return code: 0 (ok)
- 做了同样的事情,但这次服务器使用了中间证书 - 也很棒,
Verify return code: 0 (ok)
- 做了同样的事情,但这次服务器使用了叶子证书 - 这次我得到了
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证书突然失效?
解决方案
这似乎是大多数人一直陷入设置 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
推荐阅读
- semantic-versioning - 在使用 SemVer 进行初始开发时,我应该如何提升我的应用程序版本?
- c++ - Dijkstra 没有访问所有顶点
- typescript - 打字稿:允许泛型类型但不允许它的子类型
- terraform - 如何让 Terraform 在 Docker 容器之前启动 Docker 网络
- java - 核心转储发生在 Java 本机方法中
- certificate - OV证书:你需要多少次下载才能摆脱智慧屏?
- javascript - 如何在列中插入图像(jsPDF自动表)?
- google-sheets - 使用 Google 表格自动从 CoinGecko 收集历史数据
- mysql - 带有默认和自定义编码器的 Django JSONField
- c# - 为什么在使用 Xamarin Forms WebView 时必须等待 JavaScript 评估?