9

我们使用 Apache 2.2.25 和mod_ssl在反向代理模式下使用mod_proxy。它有一个我们用于测试目的的服务器证书,由 GoDaddy 颁发。链中有 3 个证书,server cert -> GoDaddy intermediate CA -> GoDaddy Root CA. 中间 CA(Go Daddy Secure Certificate Authority - G2)并不总是在客户端的受信任 CA 列表中找到。

与服务器的 SSL 连接适用于浏览器(至少对于某些浏览器),但不适用于其他一些客户端。我们注意到我们的服务器没有发送完整的证书链,通过使用以下命令:openssl s_client -showcerts -connect SERVER_URL:443,并且确实该命令报告了错误Verify return code: 21 (unable to verify the first certificate)

我们SSLCertificateFile在每个 VirtualHost 中使用该指令:

SSLCertificateFile certificate.crt

其中 certificate.crt 文件包含私钥和链中的所有证书。我们尝试将其拆分为以下内容:

SSLCertificateFile server.crt
SSLCertificateKeyFile server.key
SSLCertificateChainFile chain.crt

但这并没有改变什么。

谢谢你的帮助!

编辑
情节变厚 - 它似乎是证书和服务器的某种组合。
(使用SSL Shopper工具进行测试)

  1. Apache 2.2 (RHEL) 上的 Go Daddy 证书(如上) -不起作用
  2. 相同的证书,在 IIS7 上 -有效
  3. Apache 2.2 RHEL 上的客户证书(来自 Comodo) -有效
4

4 回答 4

13

你在正确的轨道上。

SSLCertificateFile server.crt      >> Your public certificate
SSLCertificateKeyFile server.key   >> Your private key
SSLCertificateChainFile chain.crt  >> List of intermediate certificates;
                                 in your case, only one - GoDaddy intermediate CA

使用SSL Labs之类的工具检查您的服务器配置,以确定您是否发送了正确的中间证书。

于 2015-05-20T13:42:35.643 回答
3

您还可以使用该SSLCACertificatePath指令并将原始.crt文件放入指定的目录中。但是,您还必须为它们创建哈希符号链接。这是使用工具完成的,该c_rehash工具是openssl. 例如,

sudo c_rehash /etc/apache2/ssl/certs

但是,请注意,使用了两种散列算法。新的是1.0引入的,升级到1.0或更高版本后openssl需要重新运行。这将创建旧式和新式符号链接。c_rehashopenssl

如果您不这样做,openssl(因此apache)将无法找到中间证书,因此它们不会被发送给客户端。在将 Ubuntu 服务器从 Lucid 升级到 Precise 后,我花了令人沮丧的几个小时调试 SSL 错误,其中包括openssl从 0.9.8 升级到 1.0.1。我搜索但在网上找不到任何关于出了什么问题的线索,所以不得不自己弄清楚。

作为记录,我们没有在浏览器中遇到错误,因为它具有更大的根集,并且我们的一个中间证书必须在该集中。该问题仅在使用openssl基于命令行的程序时出现,例如wget,curlopenssl s_client.

于 2015-11-18T23:19:49.597 回答
1

如果将来有人遇到类似问题:

在我的情况下,一台服务器没有发送配置的中间证书(但其他服务器发送了) - 这似乎是证书文件中行尾的问题。显然,2019 年之前的 Apache 版本可能相当挑剔——只接受行以换行符结尾的证书(NL、char 10、Unix 行结尾),并默默地忽略行以回车符、换行符结尾的证书(CR+NL、chars 13 和 10,Windows 行结尾),或仅回车(CR,字符 13,Mac OS <10)。

我的中间证书有 CR 行结尾(在这个时代非常奇怪) - 使用文本编辑器将其转换为 NL 结尾修复它,Apache 现在正确发送中间证书。

于 2021-02-09T11:11:52.537 回答
1

我有 httpd 2.4 没有发送用SSLCertificateChainFile.

结果证明证书文件在文件系统上的权限错误,而 apache 只是忽略了它们。正确的权限掩码是 400 :

[root@server ~]# ll /etc/httpd/conf/tls/certs/intermediate_chain.crt 
-rw-r--r-- 1 root root 1728 Mar  2 14:20 /etc/httpd/conf/tls/certs/intermediate_chain.crt 
#   ^  ^ wrong permissions

[root@server conf.d]# chmod 400 /etc/httpd/conf/tls/certs/intermediate_chain.crt 

[root@server ~]# ll /etc/httpd/conf/tls/certs/intermediate_chain.crt 
-rw------- 1 root root 1728 Mar  2 14:20 /etc/httpd/conf/tls/certs/intermediate_chain.crt 
#   ^  ^ correct permissions

也许这可以帮助某人

于 2021-03-02T13:43:48.853 回答