我已经组装了一个 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 指令中单独提供链文件。
答案 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}} 并且不能再进一步 - 它没有那个证书来查看谁签署了它。