有几台计算机(但不是大多数)拒绝了我的网络服务器的 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。