2009-09-21 51 views
33

我的应用使用SSL与服务器进行安全通信,并且无法验证证书链。链是这样的:理解SSL证书链验证的问题

Entrust.net安全服务器证书颁发机构 - > DigiCert全球CA - > * .ourdomain.com

我们使用的是证书存储来自Mozilla的拉动。它包含Entrust.net证书,但不包含DigiCert全球CA证书。

我的理解是,中间的权威没有,只要root权限被信任,但验证失败:

% openssl verify -CAfile mozilla-root-certs.crt ourdomain.com.crt 
error 20 at 0 depth lookup:unable to get local issuer certificate 

所以我需要明确地信任DigiCert全球CA在为了验证通过?这似乎是错误的。但你告诉我!

编辑:我现在明白,证书文件需要预先提供给OpenSSL。像这样的工作:

% openssl verify -CAfile mozilla-root-certs.crt -untrusted digicert.crt ourdomain.com.crt 
ourdomain.com.crt: OK 

这让我提供DigiCert CA的副本,而不明确地说:“我相信它”,整个产业链仍有待验证。

但是像Firefox这样的浏览器肯定不会总是附带它需要的每一个证书的副本。总会有新的CA,关键是要使用根证书的安全性来确保所有中间CA都是有效的。对?那么如何这项工作?它看起来真的很傻吗?

+0

在OpenBSD上,'-CAfile'可以设置为'/ etc/ssl/cert.pem'。 – 2015-07-24 12:30:41

回答

16

中级证书必须安装在您的Web服务器以及您自己的域的证书。上周我遇到了同样的问题...... Firefox似乎比其他浏览器更挑剔。

+4

啊哈...好的。感谢大卫的洞察力。 对于那些来自Google的人来说,配置apache的关键词是SSLCertificateChainFile。看到这个(来自DigiCert本身!) http://www.digicert.com/ssl-certificate-installation-apache.htm – 2009-09-21 18:59:58

+0

最棒的。谢谢,乔希,这帮助了我很多。 – 0xCAFEBABE 2011-08-18 10:00:23

6

这里是验证从Web服务器

  • 客户维护可信CA根证书列表来一个certficate正确的方式
  • 的Web服务器将返回下面的服务器证书 - 要求
  • 中级证书(s) - 必需ROOT CA证书 - 不需要/可选

当客户端连接到服务器时,它会获得服务器证书和中介来自服务器的证书。然后,客户端从服务器证书建立一个信任链,通过中间证书到它所信任的其中一个CA ROOT证书。 ROOT证书始终是自签名的 - 所以这就是链条停止的地方。

下面是一个简单的命令用openssl

openssl s_client -CAfile <root ca file> -quiet -showcerts -connect IP:PORT 

在虚拟主机,其中多个证书送达同一IP的情况下进行测试的web服务器证书:PORT,服务器名称指示(SNI)可以使用-servername <FQDN>启用。否则,将发送默认证书。