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

一些电脑,但不是大多数,拒绝从我的networking服务器的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.conf通过stunnel在我的服务器上处理SSL:

 cert = $CODEZ/admin/production/proxy/asana.pem CAfile = $CODEZ/admin/production/proxy/sf_bundle.crt pid = client = no [<forwarded port>] accept = 443 connect = 8443 

任何想法我可能做错了什么?

CAFile选项将CAconfiguration为用于客户端身份validation证书; 这不是你想要的。

相反,您希望在cert选项中创build文件以包含整个适用的证书链。 您需要保存该文件的备份副本,然后创build一个新副本; 基本上结合了这两个文件,格式如下:

 -----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命令对于testing证书链问题和检查您的服务如何呈现其证书非常有用。

编辑:好吧..证书包的链是三深,但信任链看起来深深。 有什么不对的

顶级证书(“Starfield安全证书颁发机构”)由名为“Starfield Class 2证书颁发机构”的发行机构签署,指纹以ad7e1c28 。但是证书中的第二个证书与第一个证书的签署人完全相同,这应该是完全相同的证书,从363e4734开始的指纹和10年前的到期date。 然后第三个(根)证书是包含的中间证书的签署者..但这两者都没有任何关系的第一个!

如果没有意义的话,别担心。 总结:马虎的工作,有人认真地丢弃了这个证书包的球。 那么最好的办法就是从浏览器中以base-64格式导出文件,这个浏览器可以成功validation这个链,把它们粘贴成我从那里列出的格式。

由于这是一个混乱的混乱,没有你自己的错误,我猜你的DNS名称,并抓住证书,我认为这应该是你需要的完整链: http : //pastebin.com/Lnr3WHc8

Qualys SSLLabs在更改后检查您的configuration非常方便。

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

检查你有

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

对于任何其他人面临这个问题,谢恩的职位做了伎俩,但我也不得不包括CAFile。 另外,在创build链时,请确保按照本文中的文件命名说明进行操作

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

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

所以,在上面的情况下,你a4644b49.0文件重命名为a4644b49.0
(注意,这是一个零,而不是字母'O',在文件名中的点。)

如果您没有c_hash程序,则可以运行相应的OpenSSL命令来确定散列值:

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

如果你正面临这个问题,你正在尝试使用android cordova的websockets,一定要手动添加wss到你的cordova-whitelist的东西,因为*只包括http和https。