无法理解SSL证书链验证

时间:2009-09-21 18:23:03

标签: 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

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

编辑:我现在明白证书文件需要预先提供给OpenSSL。这样的事情有效:

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

这使我能够提供DigiCert CA的副本而不明确说“我相信它”,整个链仍然需要验证。

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

2 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:7)

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

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

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

这是一个使用openssl

测试Web服务器证书的简单命令
openssl s_client -CAfile <root ca file> -quiet -showcerts -connect IP:PORT

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