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