我如何确保 stunnel 发送所有中间 CA 证书?

我如何确保 stunnel 发送所有中间 CA 证书?

有几台计算机(但不是大多数)拒绝了我的网络服务器的 SSL 证书。问题似乎是某些计算机拒绝 CA 证书。这个问题似乎在 Mac OS X 10.6 未完全更新时出现。

根据http://www.sslshopper.com/index.php?q=ssl-checker.html#hostname=beta.asana.com- 这里没有问题。

根据http://certlogik.com/sslchecker/,没有中间证书被发送下去。

我的证书来自 Starfield Technologies,我使用的是sf_bundle.crt这里:certs.godaddy.com/anonymous/repository.seam

我正在通过 stunnel 在我的服务器上处理 SSL,如下所示stunnel.conf

cert = $CODEZ/admin/production/proxy/asana.pem
CAfile = $CODEZ/admin/production/proxy/sf_bundle.crt
pid =
client = no

[<forwarded port>]
accept = 443
connect = 8443

知道我可能做错了什么吗?

答案1

CAFile选项配置一个 CA 用于客户端身份验证证书;这不是您想要的。

相反,您需要在选项中制作cert包含整个适用证书链的文件。您需要保存该文件的备份,然后制作一个新文件;基本上将两个文件合并在一起,格式如下:

-----BEGIN CERTIFICATE-----
(certificate from asana.pem file pasted here)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(intermediate certificate here; copy-paste the top chunk from the bundle)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(root certificate here; copy-paste the bottom chunk from the bundle)
-----END CERTIFICATE-----

这将强制 stunnel 向客户端提供完整的证书链。

还有一个小提示;该openssl s_client命令对于测试证书链问题和检查您的服务如何呈现其证书非常有用。

编辑: 好的。证书包的链有三层深度,但信任链看起来有两层深度。有些不对劲。

顶级证书(“Starfield 安全证书颁发机构”)由名为“Starfield Class 2 证书颁发机构”的颁发者签名,其指纹以 .. 开头ad7e1c28。但证书包中的第二个证书的名称与第一个证书的签名者完全相同,应该是完全相同的证书,指纹以 开头363e4734,有效期早 10 年。那么第三个(根)证书是所含中间证书的签名者……但这两个证书与第一个证书没有任何关系!

如果这没有意义,请不要担心。总结:工作马虎,有人在构建此证书包时严重失误。那么,最好的办法是从成功验证链的浏览器导出 base-64 格式的文件,然后将它们粘贴到我在此处列出的格式中。

由于这是一个令人困惑的混乱局面,而这不是您自己的错,我猜测了您的 DNS 名称并获取了证书,我认为这应该是您需要的完整链:http://pastebin.com/Lnr3WHc8

答案2

Qualys SSLLabs 对于在更改后检查配置非常方便。

https://www.ssllabs.com/ssldb/analyze.html

检查你是否拥有

  • 启用强密码
  • 弱密码已禁用
  • 证书链完整且顺序正确

答案3

对于其他遇到此问题的人,Shane 的帖子解决了这个问题,尽管我还必须包含 CAFile。此外,在创建链时,请确保按照以下文件命名说明进行操作本文

要确定您应该使用的文件名,您可以使用 OpenSSL 附带的 c_hash 程序(在/usr/local/ssl/misc目录中):

c_hash some_certificate.pem
a4644b49.0 => some_certificate.pem

因此,在上述情况下,您需要将文件重命名为a4644b49.0
(请注意,文件名中的点后面是零,而不是字母“O”。)

如果您没有该c_hash程序,您可以运行适当的 OpenSSL 命令来确定哈希值:

openssl x509 -hash -noout -in some_certificate.pem
a4644b49

如果您在尝试将 websockets 与 android cordova 结合使用时遇到此问题,请务必手动将 wss 添加到您的 cordova 白名单中,因为 * 仅包含 http 和 https。

相关内容