Openssl 证书验证比浏览器更严格/不同?

时间:2021-07-21 22:50:05

标签: ssl openssl

我已经组装了一个 Linux (Centos 7) 服务器来为 eye-n-sky.net 提供服务。

将来自该站点的内容提供给 Win10 和 Linux 系统上的浏览器效果很好。但是,当我使用openssl访问该站点时,

openssl s_client -connect eye-n-sky.net:443

站点证书被拒绝,

Verify return code: 21 (unable to verify the first certificate)

我已经得出结论,浏览器验证证书的方式与 openssl 不同。我在正确的轨道上吗?

我已经在三个不同的 openssl 实例(Debian、Centos、FreeBSD)上对此进行了测试,结果一致。

Openssl 作为其他站点的客户端,例如www.godaddy.com,microsoft.com,工作正常,能够根据已安装的 CA 链验证证书。

认为我缺少 CA 证书,我使用 -CAfile 选项指定可能缺少的证书,但没有任何效果。

我错过了什么?我猜 openssl 有更严格的验证规则,但我不知道在哪里配置。

谢谢, 安迪


总结:是的,当需要包含中间证书和根证书时,eye-n-sky 只提供它的证书。

然而,我花了很长时间才发现我的 Apache 版本不支持在服务器证书文件中包含链。相反,我必须在 SSLCertificateChainFile 指令中单独提供链文件。

1 个答案:

答案 0 :(得分:0)

OpenSSL 的命令行 s_client 实用程序没有内置任何内容来验证服务器的证书。浏览器有一个内置的可信证书列表来验证服务器证书。

您必须使用 -CAfile file-CApath directory 等选项提供受信任的证书。根据{{​​3}}:

<块引用>

-CApath 目录

用于服务器证书验证的目录。这 目录必须是“散列格式”,查看 OpenSSL 1.1.1 s_client man page 了解更多 信息。这些也用于构建客户端证书 链。

-CAfile 文件

包含在服务器期间使用的可信证书的文件 身份验证并在尝试构建客户端时使用 证书链。

注意“证书链”等词的使用。如果您转到 verify(1),您会看到服务器的证书适用于 *.godaddy.com,但它由 Go Daddy Secure Certificate Authority - G2 签名,而该中间证书由 Go Daddy Root Certificate Authority - G2 签名 - a不同的证书。该链中共有三个证书。

godaddy.com,所以如果您的 CA 文件只有来自 Go Daddy Root Certificate Authority - G2 的证书而不是来自 Go Daddy Secure Certificate Authority - G2 的证书,OpenSSL 会从服务器的证书本身看到它是由 {{ 1}} 并且不能再进一步 - 它没有那个证书来查看谁签署了它。