如何强制Apache 2.2发送完整的证书链?

时间:2015-05-20 08:58:28

标签: apache ssl certificate reverse-proxy mod-ssl

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

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

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

SSLCertificateFile certificate.crt

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

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

但这并没有改变任何事情。

感谢您的帮助!

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

  1. 在Apache 2.2(RHEL)上转到Daddy证书(如上所述) - 无效
  2. 相同的证书,在IIS7上 - 工作
  3. 在Apache 2.2 RHEL上
  4. 客户证书(来自Comodo) - 工作

4 个答案:

答案 0 :(得分:9)

你走在正确的轨道上。

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等工具检查您的服务器配置,以确定您是否发送了正确的中间证书。

答案 1 :(得分:2)

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

sudo c_rehash /etc/apache2/ssl/certs

但请注意,有两种哈希算法正在使用中。新版本随openssl 1.0一起推出,在将c_rehash升级到1.0或更高版本后重新运行openssl是必要的。这将创建旧式和新式符号链接。

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

为了记录,我们在浏览器中没有收到错误,因为它有一组更大的根,我们的一个中间证书必须在该集合中。使用基于openssl的命令行程序(例如wgetcurlopenssl s_client时,只会出现此问题。

答案 2 :(得分:0)

以防将来有人遇到类似问题:

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

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

答案 3 :(得分:0)

我的 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

也许这对某人有帮助