我的应用程序使用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都有效.对?那么,如何做这项工作?它看起来真的很傻吗?
必须在Web服务器上安装中间证书以及您自己域的证书.上周我遇到了同样的问题...... Firefox似乎比其他浏览器更挑剔.
以下是验证来自Web服务器的证书的正确方法
客户端维护可信CA ROOT证书的列表
Web服务器应返回以下服务器证书 - 必需
中级证书 - 必需的ROOT CA证书 - 不需要/可选
当客户端连接到服务器时,它从服务器获取服务器证书和中间证书.然后,客户端从服务器证书构建信任链,通过中间证书到其信任的CA ROOT证书之一.ROOT证书总是自签名的 - 这就是链条停止的地方.
这是一个使用openssl测试Web服务器证书的简单命令
openssl s_client -CAfile-quiet -showcerts -connect IP:PORT
在虚拟主机的情况下,在同一IP上提供多个证书:PORT,可以使用服务器名称指示(SNI)-servername
.否则,将发送默认证书.