尽管安装了新证书,Apache 似乎仍在使用旧的过期证书

尽管安装了新证书,Apache 似乎仍在使用旧的过期证书

Apache 2.2.3/mod_ssl/CentOS 5.5 VPS

我们的证书于 2011-10-06 到期,尽管我们似乎已经正确安装了新证书,浏览该网站仍然显示证书已过期!我尝试删除浏览器缓存并使用了几种不同的浏览器。ssl.conf 文件中的相关行(我已排除注释掉的行):

Listen 127.0.0.1:443
SSLSessionCache         shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout  300
# Note - I tried disabling SSLSessionCache with the "none" setting but it didn't help.
<VirtualHost 127.0.0.1:443>
SSLEngine on
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /var/certs/gentlemanjoe.com/new2011/gentlemanjoe.com.crt
SSLCertificateKeyFile /var/certs/gentlemanjoe.com/new2011/gentlemanjoe.com.key
SSLCertificateChainFile /var/certs/gentlemanjoe.com/new2011/gd_bundle.crt
SetEnvIf User-Agent ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
ServerAdmin [email protected]
DocumentRoot /var/www/gentlemanjoe.com
ServerName gentlemanjoe.com
<Directory /var/www/gentlemanjoe.com>
    AllowOverride All
    Order deny,allow
    allow from all
</Directory>          
</VirtualHost>

我检查过的东西

首先,我尝试将旧的证书和密钥文件移动到一个完全不同的文件夹,以确保 Apache 不会以某种方式抓取它们。什么都没有改变。为了好玩,我尝试暂时重命名新的证书和密钥文件,Apache 尽职尽责地抱怨并拒绝启动。

然后我尝试确保我没有被编辑错误的配置文件所欺骗。使用“locate”,我在 /etc/httpd/conf/httpd.conf 下只找到了一个 httpd.conf 文件。我还使用“locate”验证了只有一个 ssl.conf 文件,即 /etc/httpd/conf.d/ssl.conf。密钥文件是我使用 OpenSSL 生成的,遵循了 GoDaddy 提供的生成 CSR 的说明。

我已经通过将 test.html 文件上传到 /var/www/gentlemanjoe.com 文件夹并验证我可以浏览它来验证我正在使用的是正确的网站。但如果我尝试在 HTTPS 中查看测试文件,我会收到相同的证书过期警告。

我已验证证书本身具有正确的到期日期:

openssl x509 -in /var/certs/gentlemanjoe.com/new2011/gentlemanjoe.com.crt -noout -text

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            07:e7:49:69:97:96:16
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com, Inc., OU=http://certificates.godaddy.com/repository, CN=Go Daddy Secure Certification Authority/serialNumber=07969287
        Validity
            Not Before: Oct 21 17:37:55 2011 GMT
            Not After : Oct  8 21:16:03 2013 GMT
        Subject: C=CA, ST=BC, L=Burnaby, O=Diamond Bailey Consolidated Commercial Services Ltd, OU= , CN=www.gentlemanjoe.com

我尝试使用新的 CSR 在 GoDaddy 上重新输入证书,一切似乎都正常,但我在浏览器中得到了相同的结果。

可能的线索 #1

每当我执行“apachectl restart”时,我都会在 error_log 文件中看到以下内容:

[Fri Oct 21 18:03:33 2011] [notice] SIGHUP received.  Attempting to restart
[Fri Oct 21 18:03:33 2011] [notice] Digest: generating secret for digest authentication ...
[Fri Oct 21 18:03:33 2011] [notice] Digest: done
[Fri Oct 21 18:03:33 2011] [info] APR LDAP: Built with OpenLDAP LDAP SDK
[Fri Oct 21 18:03:33 2011] [info] LDAP: SSL support available
[Fri Oct 21 18:03:33 2011] [info] Init: Seeding PRNG with 256 bytes of entropy
[Fri Oct 21 18:03:33 2011] [info] Init: Generating temporary RSA private keys (512/1024 bits)
[Fri Oct 21 18:03:33 2011] [info] Init: Generating temporary DH parameters (512/1024 bits)
[Fri Oct 21 18:03:33 2011] [info] Shared memory session cache initialised
[Fri Oct 21 18:03:33 2011] [info] Init: Initializing (virtual) servers for SSL
[Fri Oct 21 18:03:33 2011] [warn] RSA server certificate CommonName (CN) `www.gentlemanjoe.com' does NOT match server name!?
[Fri Oct 21 18:03:33 2011] [info] Server: Apache/2.2.3, Interface: mod_ssl/2.2.3, Library: OpenSSL/0.9.8e-fips-rhel5
[Fri Oct 21 18:03:34 2011] [notice] Apache/2.2.3 (CentOS) configured -- resuming normal operations
[Fri Oct 21 18:03:34 2011] [info] Server built: Aug 30 2010 12:28:40

GoDaddy 的技术人员告诉我,www 和非 www 并不重要,我也同意这一点,因为我的浏览器中的安全警告是不是抱怨服务器名称不匹配,而是到期,表明旧证书仍以某种方式被加载。

可能的线索 #2

HTTP 服务器响应标头http://gentlemanjoe.com显示的是“Andromeda”而不是“Apache”。这对我来说似乎很奇怪,因为我在 Google 上搜索“Andromeda”会得到一个媒体服务器类型的项目,而这个项目不会安装在这台服务器上(但我不能肯定地说,因为我没有设置任何这些,通常的管理员/开发人员正在度假,我只是在帮助朋友处理他的网站。)此外,httpd.conf 文件不包含字符串“Andromeda”,表明它没有被修改以输出这个字符串。所以这可能是他正在使用的 Magento 电子商务平台,但替换标准 Apache 响应标头有什么意义呢?

答案1

Apache 前面有东西。查看该配置:

Listen 127.0.0.1:443
....
<VirtualHost 127.0.0.1:443>

它仅在本地主机上监听,因此互联网客户端不会直接访问此服务 - 它们可能会被代理。

为了检查 Apache 是否加载了正确的证书,请直接在 Apache 的侦听器上点击该服务:openssl s_client -connect 127.0.0.1:443 -showcerts

不确定 Andromeda 标题,因此,让我们找到该过程:lsof -i

Apache 将具有127.0.0.1:443,而其他一些服务具有0.0.0.0:443(或 VPS 的公共地址:443) - 这是需要新证书的服务。

答案2

此问题的一个常见根源是多个正在运行的 Apache 实例。配置更改由您(重新)启动的进程获取,但请求由使用旧配置运行的旧进程处理。

停止服务:

service apache2 stop

检查网站是否仍可访问。如果可以,则您已找到原因。

现在运行

ps aux | grep apache

它将为您提供正在运行的 apache2 进程及其 PID 的列表。将它们全部杀死(请注意,此命令还可能返回名称/用户等中包含 Apache 的无关进程,例如 Apache Tomcat,您可能不想杀死它们。)

kill <pid>

再次运行 ps aux 并确保进程不再运行。

再次检查网站是否可以访问。应该不能。

现在启动 apache 服务

service apache2 start

验证新证书是否正在提供。

如果你不想终止进程,你可以重启系统。效果是一样的。

答案3

谢谢!这个帖子也为我指明了解决问题的正确途径。Apache 似乎使用了正确的证书,但我的 haproxy 服务自 letsencrypt 证书续订以来就没有重新启动过,并且仍然显示旧证书。重新启动我的 haproxy 服务解决了我的问题。

相关内容