我最近更新了我的网站上的 SSL 证书,虽然最初看起来证书安装正确,但几个小时前我震惊地发现 HTTPS 连接不再能通过某些浏览器和版本正确进行身份验证。
目前,以下浏览器可以验证成功:
- Internet Explorer 8
- Internet Explorer 9
- Google Chrome 8
- Opera 11
- Firefox 3.6.21(在 Windows 2000 上)
但它不能正确地进行身份验证:
- Firefox 3.6.13(在 Windows XP 上)
- Firefox 6.01(在 Windows 7 上)
- Internet Explorer 6(在 Windows 200 上)
该证书的证书路径为GeoTrust Global CA > RapidSSL CA > secure.mydomain.com
。
什么可以解释这个问题?这是安装问题吗?浏览器问题?证书问题?
我该如何解决这个问题?
答案1
我遇到了同样的问题 - 购买了一个基本的 SSL 证书(来自 Network Solutions),将其安装在 nginx 下,它在 Opera 和 IE 中都可以正常工作 - 但 Firefox 3.6.12 不行。这就是我解决问题的方法。请注意,我有 VPS 的 root/shell 访问权限,我不知道您是否有(至少这可能会为您的提供商指明正确的方向)。
找到解决方案的第一步是使用Qualys(按照另一个答案)它告诉我链条不完整。
其次,我使用了OpenSSL用于测试/调试。假设您有 shell 访问权限,您可以执行以下命令(问或 CTRL-C 断开连接):
openssl s_client -connect mysite.com:443
您可能会看到错误“无法获取本地颁发者证书”。这也是一种在 shell 中测试它是否正常工作的方法,无需运行 Firefox。
SSL 证书链
某些浏览器可能会对知名证书颁发机构签署的证书产生抱怨,而其他浏览器可能会毫无问题地接受该证书。发生这种情况的原因是,颁发机构使用中间证书签署了服务器证书,而该证书并不存在于与特定浏览器一起分发的知名可信证书颁发机构的证书库中。在这种情况下,颁发机构会提供证书链应与已签名的服务器证书连接。服务器证书必须出现前合并文件中的链式证书
Nginx 配置
就我而言,我从 Network Solutions 获得了三个文件 - mysite.com.crt
、AddTrustExternalCARoot.crt
和NetworkSolutionsDVServerCA.crt
。没有捆文件,但可以从其他证书创建一个。经过反复尝试,我发现我需要的是:
$ cat mysite.com.crt NetworkSolutionsDVServerCA.crt > mysite.com.chain.crt
最后一步是使用新文件重新配置我的 nginx 服务器:
server {
listen 443;
ssl on;
ssl_certificate /etc/ssl/certs/mysite.com.chain.crt;
ssl_certificate_key /etc/ssl/private/mysite.com.key;
server_name mysite.com;
# and so on
}
在捆绑包中获取正确的证书并重新启动 nginx 后,openssl
没有报告错误,Firefox 毫无问题地获得了页面,并且 Qualys 报告该链有效。
Apache 配置
由于您正在运行 Apache,因此您(或您的提供商)需要为 SSL 配置具有正确的文件位置,其中一个是缺失的中间的链文件:
<VirtualHost 192.168.0.1:443>
DocumentRoot /var/www/html2
ServerName www.yourdomain.com
SSLEngine on
SSLCertificateFile /path/to/your_domain_name.crt
SSLCertificateKeyFile /path/to/your_private.key
SSLCertificateChainFile /path/to/DigiCertCA.crt
</VirtualHost>
答案2
在您的域上尝试以下测试:
Qualys:https://www.ssllabs.com/ssldb/index.html
DigiCert:http://www.digicert.com/help/
我发现这两者对于解决随机 SSL 证书问题都非常方便。
答案3
我将它用于 Nginx 和 StartSSL,它也需要类 CA:
cat ssl.pem ca.pem sub.class1.服务器.ca.pem > 服务器.pem
或者
cat ssl.pem ca.pem sub.class2.server.ca.pem > server.pem
(根据班级水平)
答案4
证书可以包含特殊权限信息访问扩大 (RFC-3280) 以及颁发者证书的 URL。大多数浏览器可以使用 AIA 扩展下载缺失的中间证书以完成证书链。但有些客户端(旧版和移动版浏览器、OpenSSL)不支持此扩展,因此它们会将此类证书报告为不受信任。
你可以解决证书链不完整通过将证书中的所有证书连接到受信任的根证书(按此顺序排除)来手动颁发,以防止此类问题。请注意,受信任的根证书不应存在,因为它已包含在系统的根证书存储中。
您应该能够从颁发者处获取中间证书并自行将它们连接在一起。我编写了一个脚本来自动执行该过程,它循环遍历 AIA 扩展以生成正确链接的证书的输出。https://github.com/zakjan/cert-chain-resolver