35

我的应用程序使用 SSL 与服务器进行安全通信,但无法验证证书链。链条看起来像这样:

Entrust.net 安全服务器证书颁发机构 -> DigiCert 全球 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 都是有效的。对?那么这是如何工作的呢?真的像看起来那么傻吗?

4

2 回答 2

17

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

于 2009-09-21T18:40:14.550 回答
7

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

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

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

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

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

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

于 2012-09-04T17:40:17.570 回答