无法理解SSL证书链验证

jos*_*hk0 35 openssl ssl-certificate

我的应用程序使用SSL与服务器安全通信,并且无法验证证书链.链看起来像这样:

Entrust.net安全服务器认证机构 - > DigiCert Global CA - >*.ourdomain.com

我们正在使用从Mozilla取出的证书商店.它包含Entrust.net证书,但不包含DigiCert Global CA证书.

我的理解是,只要根权限是,但不必信任中间权限,但验证失败:

% openssl verify -CAfile mozilla-root-certs.crt ourdomain.com.crt
error 20 at 0 depth lookup:unable to get local issuer certificate
Run Code Online (Sandbox Code Playgroud)

那么我需要明确信任DigiCert Global CA才能通过验证吗?这似乎是错的.但是你告诉我!

编辑:我现在明白证书文件需要预先提供给OpenSSL.像这样的东西有效:

% openssl verify -CAfile mozilla-root-certs.crt -untrusted digicert.crt ourdomain.com.crt
ourdomain.com.crt: OK
Run Code Online (Sandbox Code Playgroud)

这允许我提供DigiCert CA的副本而不明确说"我相信它",整个链仍然需要验证.

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

Dav*_*vid 17

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

  • 啊啊......好的 感谢David的见解.对于那些来自谷歌的人来说,配置apache的关键词是SSLCertificateChainFile.看到这个(来自DigiCert本身!)http://www.digicert.com/ssl-certificate-installation-apache.htm (4认同)

小智 7

以下是验证来自Web服务器的证书的正确方法

  • 客户端维护可信CA ROOT证书的列表
  • Web服务器应返回以下服务器证书 - 必需
  • 中级证书 - 必需的ROOT CA证书 - 不需要/可选

当客户端连接到服务器时,它从服务器获取服务器证书和中间证书.然后,客户端从服务器证书构建信任链,通过中间证书到其信任的CA ROOT证书之一.ROOT证书总是自签名的 - 这就是链条停止的地方.

这是一个使用openssl测试Web服务器证书的简单命令

openssl s_client -CAfile <root ca file> -quiet -showcerts -connect IP:PORT
Run Code Online (Sandbox Code Playgroud)

在虚拟主机的情况下,在同一IP上提供多个证书:PORT,可以使用服务器名称指示(SNI)-servername <FQDN>.否则,将发送默认证书.