我正在运行带有 Apache2 v2.4.7 的 Ubuntu 14.04 服务器。
最近,我们的网站收到来自 Chrome 的错误提示,提示我们需要更新证书。我本周早些时候刚刚完成更新,更新了 SSL 证书,然后重新启动了 Apache。几天后,我的客户回来告诉我,某些图像和文件无法通过他们的报告服务器访问。报告服务器使用 HTTPS 来获取图像和文件。
我的配置文件中有这个,自从我继承了这个服务器之后它就没有改变过:
<VirtualHost *:80>
ServerName abc.example.com
DocumentRoot /home/deployer/html/_abc/public
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^/files/
RewriteCond %{REQUEST_URI} !^/images/checksheets/
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</VirtualHost>
<VirtualHost *:443>
ServerName abc.example.com
DocumentRoot /home/deployer/html/_abc/public
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ECD....C3-SHA:!DSS
SSLHonorCipherOrder on
SSLCompression off
SSLCertificateFile /etc/ssl/ssl_certificate.crt
SSLCertificateKeyFile /etc/ssl/abc_staging.key
SSLCertificateChainFile /etc/ssl/IntermediateCA.crt
# HSTS (mod_headers is required) (15768000 seconds = 6 months)
Header always set Strict-Transport-Security "max-age=15768000"
<Directory /home/deployer/html/_abc/public>
AllowOverride all
Options FollowSymLinks
# -MultiViews
# Order allow,deny
Require all granted
</Directory>
我在服务器上所做的唯一一件事就是更新 ssl_certificate 和 IntermediateCAs 并重新启动 Apache,所以我不确定发生了什么。上次更新 SSL 证书大概是在一年前,报告服务器抓取图像/文件的方式没有改变。我也经常重新启动 Apache,以前从来没有出现过这个问题。
我的客户一时兴起,使用http
而不是创建了一份新报告https
,而且似乎运行得很好。
我的问题是,什么情况可能发生,导致服务器突然不再接受https
图像/文件的连接?
编辑:这些只是 GET 请求(没有 POST/DELETE 操作)。
此外,使用 HTTPS 导航到图像(或文件)https://abc.example.com/images/path/to/file.jpg
完全没问题。但当报告服务器使用同一链接时,会显示空白页。
直接导航时,Apache 访问日志将显示上述链接作为命中,但是当报告服务器使用它并且我导航到报告时,Apache 访问日志根本不显示任何内容。
答案1
在您的<VirtualHost *:443>
浏览器中启用 HSTS。这会告诉浏览器在内部将域的每个请求重写为 HTTPS。此后,将不再使用,RewriteCond %{REQUEST_URI} !^/files/
因为所有内容都应已无条件重写,这让您可以简化配置:
<VirtualHost *:80>
ServerName abc.example.com
Redirect permanent / https://abc.example.com/
</VirtualHost>
空白页问题似乎根本不是 Apache 导致的服务器端问题。您可以从另一台计算机访问该 URL 这一事实几乎证明了这一点。
首先清除“报告服务器”上的所有缓存,看看是否有帮助。目前尚不清楚此“报告服务器”如何工作,但空白页可能是由于混合内容策略更改导致 HTTPS 页面上未显示缓存的 HTTP URL 图像所致。如果是这样,重定向和 HSTS 策略之间的一致性可能会阻止将来出现此类缓存。
另外,将http://
内容上的所有 URL 修复为https://
。
答案2
故障排除建议:
请确认您的环境:
- 带有 Apache2 v2.4.7 的 Ubuntu 14.04 服务器。
- 您的 httpd.conf 配置为同时提供 HTTP (:80)和 HTTPS(:443)。
- 您的证书配置(上面发布)是正确的,并且文件和(SSLCertificateFile等)都存在并且没有被“损坏”。
请确认问题描述:
- 在您更新 SSL 证书之前,“一切都正常”,“问题”与新证书有关。
- 所有尝试通过 https“获取报告”的用户(示例https://apache-server.com/myreport) 失败 - 他们只看到“白色”。这是正确的吗?
- 如果相同的用户使用 http,他们就能成功获取相同的报告(例如:http://apache-server.com/myreport) 来代替。这也正确吗?
- 报告有什么“特殊”之处吗?例如,它是一个 Web 应用程序吗?
我很好奇全部https 已“损坏”,或只是“某些内容”无法访问。
请创建一个测试文件(例如
/var/www/html/myreport/hello.html
:)并验证您是否可以使用 http 和 https 读取它。测试时,请在您的电脑上使用以下一个(或两个)工具来分析浏览器的连接尝试(从而帮助确定具体的故障点):
请回复您发现的内容。
附言:
以下是一些额外的提示。特别是“启用详细日志记录”:
https://www.futurehosting.com/blog/troubleshooting-the-most-common-apache-problems-youll-encounter/
备注:
我会不是禁用 http 直到问题解决为止:
- 如果没有其他办法,这只是对于那些可能需要报告的人来说的一个临时解决办法。
- 能够比较 http 与 https 的行为将有助于排除故障。
答案3
我们找到了答案。虽然 Apache 服务器本身没有问题,但显然我们之前在证书文件中保存了一个特定的 DH 参数片段。之所以添加此片段,是因为请求图像和文件的报告服务器运行在 Java 6 上。而 Java 6 只能处理 1024 位的 DH 参数。
因此ssl_certificate.crt
,我在我的新
-----BEGIN DH PARAMETERS-----
MIGHAoGBAP//////////yQ/aoiFowjTExmKLgNwc0SkCTgiKZ8x0Agu+pjsTmyJR
Sgh5jjQE3e+VGbPNOkMbMCsKbfJfFDdP4TVtbVHCReSFtXZiXn7G9ExC6aY37WsL
/1y29Aa37e44a/taiZ+lrp8kEXxLH+ZJKGZR7OZTgf//////////AgEC
-----END DH PARAMETERS-----
从http://httpd.apache.org/docs/current/ssl/ssl_faq.html#javadh
不幸的是,这会将我们的证书从 A+ 评级降级为 B,但我不允许将 Java 服务器从 6 升级到任何更新的版本。
一旦我将该代码片段添加到我的 SSL 证书,报告服务器就能够访问图像了https
!