Apache2 - SSL 页面可以在 Chrome 中加载,但无法在 Safari 中加载

Apache2 - SSL 页面可以在 Chrome 中加载,但无法在 Safari 中加载

我在使用 Safari 时遇到了这个不寻常的 SSL 问题。基本上,我在私有网络上有一台运行 Apache 2 (2.4.10) 和 OpenSSL 1.0.1t 的 Debian 服务器。

我已经以正常方式设置了 SSL 虚拟主机,并且我正在使用中间签名的 Web 服务器证书,该证书又由使用 Apple 配置文件安装在所有机器上的私有根证书签名,并且我已经验证根证书已安装在钥匙串上。

在 Chrome 中 - 此设置运行良好。页面加载,SSL 证书链良好,Chrome 报告无错误,并显示绿色挂锁。

在 Safari (10) 中 - 但它也发生在 v9 上 - 并且在 iOS 10 上 - 我得到的只是“Safari 无法打开页面 xxx,因为 Safari 无法与服务器 xxx 建立安全连接”。

奇怪的是,如果我重新启动 Apache 服务器,它可以在 Safari 中运行几秒钟 - 足以加载一个页面 - 然后它再次失败。

在桌面上的 cURL 中 - 未知的 SSL 协议错误。

在 openssl (s_client -connect) 中 - 连接正常,协议为:TLSv1,密码为:EDH-RSA-DES-CBC3-SHA。

在 nscurl -ats-diagnostics 中 - 每次尝试都会失败。


我认为这一定是 Apache 配置的问题,因此我尽可能地删除了可能导致问题的部分,现在在我的 ssl.conf 中,我已将 SSLProtocol 设置为 ALL -SSLv3,将 SSLCipherSuite 设置为 MEDIUM:!aNull,并且在 vhost 的 .conf 文件中,我已打开 SSLEngine,其中唯一的其他 SSL 配置是证书文件、中间文件和密钥。


但该网站仍然无法在 Safari 中打开。奇怪的是,Chrome 可以正常使用!我尝试在 Safari 中访问的任何公共 SSL 网站都可以正常使用。

任何建议都值得赞赏!

答案1

查看您的跟踪记录,我想我明白了。似乎在端口 443 上通过 IPv6 回复的 Apache 虚拟主机配置为“使用”HTTP,而不是 HTTPS。

我已验证这一点,尝试连接:https://google.com:80/(或任何其他网站)进行嗅探,我得到的答复正是 400,就像你的情况一样。

因此,请检查您的 Apache VirtualHost 配置,或者如果您不打算使用 IPv6,请在您的服务器中禁用它。

答案2

每当我告诉一个软件(例如您告诉 Apache)一个密码套件字符串时,MEDIUM:!aNULL我都会首先使用openssl ciphers命令对其进行测试。这样您就可以发现许多奇怪的行为。

openssl ciphers -v 'MEDIUM:!aNULL'
DHE-RSA-SEED-SHA        SSLv3 Kx=DH       Au=RSA  Enc=SEED(128) Mac=SHA1
DHE-DSS-SEED-SHA        SSLv3 Kx=DH       Au=DSS  Enc=SEED(128) Mac=SHA1
SEED-SHA                SSLv3 Kx=RSA      Au=RSA  Enc=SEED(128) Mac=SHA1
IDEA-CBC-SHA            SSLv3 Kx=RSA      Au=RSA  Enc=IDEA(128) Mac=SHA1
IDEA-CBC-MD5            SSLv2 Kx=RSA      Au=RSA  Enc=IDEA(128) Mac=MD5
RC2-CBC-MD5             SSLv2 Kx=RSA      Au=RSA  Enc=RC2(128)  Mac=MD5
KRB5-IDEA-CBC-SHA       SSLv3 Kx=KRB5     Au=KRB5 Enc=IDEA(128) Mac=SHA1
KRB5-IDEA-CBC-MD5       SSLv3 Kx=KRB5     Au=KRB5 Enc=IDEA(128) Mac=MD5
ECDHE-RSA-RC4-SHA       SSLv3 Kx=ECDH     Au=RSA  Enc=RC4(128)  Mac=SHA1
ECDHE-ECDSA-RC4-SHA     SSLv3 Kx=ECDH     Au=ECDSA Enc=RC4(128)  Mac=SHA1
ECDH-RSA-RC4-SHA        SSLv3 Kx=ECDH/RSA Au=ECDH Enc=RC4(128)  Mac=SHA1
ECDH-ECDSA-RC4-SHA      SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=RC4(128)  Mac=SHA1
RC4-SHA                 SSLv3 Kx=RSA      Au=RSA  Enc=RC4(128)  Mac=SHA1
RC4-MD5                 SSLv3 Kx=RSA      Au=RSA  Enc=RC4(128)  Mac=MD5
RC4-MD5                 SSLv2 Kx=RSA      Au=RSA  Enc=RC4(128)  Mac=MD5
PSK-RC4-SHA             SSLv3 Kx=PSK      Au=PSK  Enc=RC4(128)  Mac=SHA1
KRB5-RC4-SHA            SSLv3 Kx=KRB5     Au=KRB5 Enc=RC4(128)  Mac=SHA1
KRB5-RC4-MD5            SSLv3 Kx=KRB5     Au=KRB5 Enc=RC4(128)  Mac=MD5

你可以从这个列表中推断出,与直觉相反,MEDIUM 意味着你想要排除HIGH 和 LOW 密码。如今,MEDIUM 已过时。您可以合理地预期,任何依赖于 RC4 或 MD5 的密码套件都会被客户端禁用,因为不安全。客户端对 IDEA 或 SEED 的支持可能不是很普遍,因为这些从来都不是主要密码。对 SHA(旧 SHA1)的支持将在不久的将来消失。

忽略openssl ciphers第二列(SSLv3这并不意味着你真的使用了 SSLv3,这只是一个最低限度所需的 SSL 级别)。

我建议使用HIGH:-RC4:-MD5:-PSK:-aNULL:-eNULL,或者,如果你想要超级新/超级安全,使用HIGH:-SHA:-RC4:-MD5:-PSK:-aNULL:-eNULL

如果您想使用超级复杂的显式密码列表(例如 Mozilla 的建议列表),请注意,在迁移到较新版本的 openssl 时,您需要不时使用新密码手动更新列表。

如果您希望明确优先考虑 Apache 上的某些密码,您可能需要这样做SSLHonorCipherOrder off,否则客户端排序将具有权威性。

答案3

对于现代浏览器来说,使用MEDIUM可能会有问题,因为它们会禁止许多旧密码。

您可以检查Mozilla 关于密码的建议例如,您可以使用其“中级兼容性(默认)”设置:(很长,只需复制粘贴)

SSL密码套件ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-A ES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS

答案4

谢谢回复。我最终通过嗅探 Safari 和 Apache 以及 Chrome 和 Apache 之间的连接找到了答案。正如我所说,服务器位于私有网络上,我使用 Avahi (zeroconf) 提供名称解析,因此我可以使用类似 web-server.local 的东西,它会自动解析为正确的 IP 地址。Safari 尝试使用 ipv6 进行连接,而 Chrome 尝试使用 ipv4。

当我尝试使用 Safari 进行连接时,Wireshark 给出了一些非常不寻常的结果 - 这是屏幕截图。似乎 SSL 连接开始建立,然后服务器立即发送了 400 错误。

使用 Safari 查看 Wireshark 的输出

我尝试在 Safari 中直接访问 IPv4 地址 - 除了明显的证书不匹配错误外,它一切正常。

因此,我在 Avahi(zeroconf 守护程序)和服务器上的 Apache 中禁用了 IPv6。重新启动后,它现在可以正常工作了。

不过,如果您能解释一下为什么会出现这样的行为,我们将不胜感激!

相关内容