通常,虚拟主机使用以下指令设置 SSL:
Listen 443
SSLCertificateFile /home/web/certs/domain1.public.crt
SSLCertificateKeyFile /home/web/certs/domain1.private.key
SSLCertificateChainFile /home/web/certs/domain1.intermediate.crt
从: 为了在具有多个虚拟主机的服务器上为单个域启用 SSL,此配置可以工作吗?
SSLCertificateFile
和有什么区别SSLCertificateChainFile
?客户已从 GoDaddy 购买了 CA 密钥。GoDaddy 似乎只提供了SSLCertificateFile
(.crt 文件) 和 SSLCertificateKeyFile (.key 文件),而没有提供SSLCertificateChainFile
。
如果没有指定路径,我的 SSL 还能工作吗SSLCertificateChainFile
?
此外,是否有一个规范的路径可以放置这些文件?
答案1
严格来说,您根本不需要该链来使 SSL 发挥作用。
你总是需要是一个SSLCertificateFile
包含SSLCertificateKeyFile
该证书正确密钥的。
问题是,如果您只向 Apache 提供证书,那么它向连接客户端提供的也只是证书 - 证书并没有说明 SSL 证书的全部情况。它表示“我已由某人签名,但我不会告诉您有关他们的信息”。
这通常很有效,因为大多数客户端系统都存储着大量的 CA 证书(包括根证书和中间证书),可以通过检查这些证书来找到匹配的签名关系,从而建立信任。但是,有时这种方法并不奏效;最常见的问题是,客户端没有持有签署了您的证书的中间 CA 的证书。
这就是信任链的作用所在;它让 Apache 向客户端准确展示信任关系,这可以帮助客户端填补您的证书、他们信任的根证书和他们不知道的中间证书之间的空白。可以通过以下两种方式之一将信任链包含在您的配置中:
- 嵌入到您为 设置的同一文件中
SSLCertificateFile
,在服务器证书后按顺序新加一行(根应在底部)。如果您像这样设置,您将希望SSLCertificateChainFile
指向与 完全相同的文件SSLCertificateFile
。 - 在指令中配置的单独文件中
SSLCertificateChainFile
;颁发服务器证书的 CA 证书应位于文件中的第一个位置,然后是任何其他证书,直至根目录。
检查您现在拥有的证书文件 - 我敢打赌它没有包含链数据。这通常可以正常工作,但最终会导致某些浏览器或其他浏览器出现问题。
答案2
这很好地解释了选择其中一个与另一个之间的差异以及可观察到的影响:
答案3
实际上,GoDaddy 确实为您提供了中间链:
http://support.godaddy.com/help/5238
这里还有更多讨论。
http://support.godaddy.com/help/868/what-is-an-intermediate-certificate
GoDaddy 向您发送的告诉您如何下载新证书的电子邮件中也会包含有关中间证书文件的信息。它位于底部某个位置,可能在您因冗长的文字和推销而看得眼花缭乱之后。
如果您没有包含正确的 SSLCertificateChainFile 指令,将会发生什么情况:您将在浏览器中看到一个大红色警告,因为您的 SSL 站点将无法在浏览器中验证,因为它们无法按照从您站点的证书到浏览器所知的证书颁发机构所拥有的证书链。
答案4
我想补充一下之前关于 SSLCertificateChainFile 的好答案,该文件中的证书顺序也很重要。基于 OpenSSL 的客户端会自行整理顺序,但基于 gnutls 的客户端会在顺序错误的链上失败。
使用 gnutls-cli 测试排序,例如
gnutls-cli --x509cafile /etc/ssl/certs/ca-certificates.crt -p https wwwsec.cs.uu.nl
其中 /etc/ssl/certs/ca-certificates.crt 是您的发行版放置组合证书的位置。