【问题标题】:How to force Apache 2.2 to send the full certificate chain?如何强制 Apache 2.2 发送完整的证书链?
【发布时间】:2015-08-01 10:02:42
【问题描述】:

我们使用带有 mod_ssl 的 Apache 2.2.25 在反向代理模式下使用 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)

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

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) - 有效

【问题讨论】:

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


    【解决方案1】:

    你在正确的轨道上。

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

    【讨论】:

    • 非常感谢,很棒的工具!我们正在使用SSL Shopper BTW。这个问题实际上看起来更奇怪 - 我会在问题中添加新信息,你能看看和地址吗?再次感谢
    • 在所有虚拟主机中添加这些指令解决了这个问题,所以我接受了答案
    • 我创建了一个共享的ssl/ssl.conf,并使用Include ssl/ssl.conf 将其包含在sites-available 中的所有虚拟主机定义中。
    • 这当然有帮助..解决了这个问题。谢谢。
    【解决方案2】:

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

    sudo c_rehash /etc/apache2/ssl/certs
    

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

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

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

    【讨论】:

    • 非常感谢!这个命令解决了我的问题。我遇到了证书链问题,大多数工具都告诉我证书链已损坏,因此广告提供商无法获取我的网站。运行此命令后,我解决了我的问题,现在我的证书链有效。非常感谢
    【解决方案3】:

    如果以后有人遇到类似问题:

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

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

    【讨论】:

      【解决方案4】:

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

      也许这对某人有帮助

      【讨论】:

        猜你喜欢
        • 2012-09-28
        • 2018-12-08
        • 1970-01-01
        • 2018-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-04
        相关资源
        最近更新 更多