Openssl 无法理解SSL证书链验证

Openssl 无法理解SSL证书链验证,openssl,ssl-certificate,Openssl,Ssl Certificate,我的应用程序使用SSL与服务器进行安全通信,但在验证证书链时遇到问题。该链如下所示: Trust.net安全服务器证书颁发机构->DigiCert Global CA->*.ourdomain.com 我们正在使用从Mozilla中提取的证书存储。它包含委托.net证书,但不包含DigiCert全局CA证书 我的理解是,只要根权限是可信的,就不必信任中间权限,但验证失败: % openssl verify -CAfile mozilla-root-certs.crt ourdomain.com.

我的应用程序使用SSL与服务器进行安全通信,但在验证证书链时遇到问题。该链如下所示:

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

我们正在使用从Mozilla中提取的证书存储。它包含委托.net证书,但不包含DigiCert全局CA证书

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

% 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都是有效的。对吗?那么这是如何工作的呢?这真的像看起来那么愚蠢吗?

中间证书必须安装在您的web服务器上,以及您自己域的证书上。上周我也有同样的问题。。。Firefox在这方面似乎比其他浏览器更挑剔。

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

  • 客户端维护受信任的CA根证书列表
  • Web服务器应返回以下服务器证书-必需
  • 中间证书-必需的根CA证书-非必需/可选
当客户端连接到服务器时,它会从服务器获取服务器证书和中间证书。然后,客户机构建一个信任链,从服务器证书通过中间证书到它信任的一个CA根证书。根证书始终是自签名的,因此链就停止了

下面是一个使用openssl测试web服务器证书的简单命令

openssl s_client -CAfile <root ca file> -quiet -showcerts -connect IP:PORT
openssl s_客户端-CAfile-quiet-showcerts-connectip:PORT

对于虚拟主机,如果在同一IP:端口上提供多个证书,则可以使用
-servername
启用服务器名称指示(SNI)。否则,将发送默认证书。

Aha。。。可以谢谢你的洞察力,大卫。对于那些来自谷歌的人来说,配置apache的关键词是SSLCertificateChainFile。看这个(从DigiCert本身看!)太棒了。谢谢你,Josh,这对我帮助很大。那么,除了Firefox以外的一些浏览器是否有可能接受服务器的SSL(我的域)证书,即使中间CA的证书既不在浏览器中也不由服务器发送?如果是这样,它是否违反了链接机制的意图?在OpenBSD上,
-CAfile
可以设置为
/etc/ssl/cert.pem