网站突然无法在 Safari 和 iOS 设备上打开

网站突然无法在 Safari 和 iOS 设备上打开

我有一个网站,直到最近它都运行良好。现在用户报告说它无法在他们的 iPhone 和 iPad 上打开。

无论您在 iOS 上尝试使用哪种浏览器,它都无法工作。在 Mac 机器上浏览时,它也无法在 Safari 中打开。不过其他浏览器可以正常工作(仅限 Mac OSX,不适用于 iOS)。

以下是服务器配置:

DigitalOcean + Ubuntu 18.04 + Nginx + PHP 7.3 (Laravel) + Let's Encrypt SSL + HTTP2 已激活

在进一步解释之前,我想提一下,使用与上述相同类型的配置,我有另一台运行良好的服务器,可以从所有设备访问。除了域名和 IP 地址之外,它们几乎完全相同(就配置和设置而言)。

我认为值得一提的另一个小额外信息是,我的用户位于伊朗。

以下是我已检查过的事项的列表:

  • 可以使用 iOS 和 Mac 上的 ping 命令访问该域名。
  • IP 地址本身也是可访问的,并且可以用来浏览网站,它只会显示“无效的 SSL 证书”警告。
  • 用于域名的 DNS 均可从 iOS 和 Mac 进行 ping 操作。
  • 如果使用 VPN 连接,则可以访问该网站。这真的很奇怪,因为从技术上讲,所有内容都是可以访问的,包括域、IP 和 DNS。
  • 除了使用 VPN,如果 SSL 完全关闭/禁用,也可以访问该网站。
  • 其他使用 Let's Encrypt SSL 的公共网站均可访问。因此,这不是 Let's Encrypt 的问题。

以下是我迄今为止尝试过的:

  • 谷歌搜索了无数次。我甚至在这里这里这里
  • 我已尝试禁用 HTTP2。
  • 我仔细检查了我的防火墙设置,甚至尝试禁用它。
  • 我已尝试禁用 GZIP。
  • 我在 ssllabs.com 上做了 ssl 测试,没有显示问题,并且与我的工作服务器相同。
  • 尝试keepalive_disable "safari"在 nginx 配置中使用
  • 我尝试过交换ssl_protocols值,例如只接受 TLSv1.3 或放弃 TLSv1.0
  • 尝试使用ssl_session_cache
  • 尝试更改ssl_ecdh_curveautosecp384r1
  • 尝试更改ssl_ciphersHIGH:!aNULL:!MD5;EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
  • 尝试更改ssl_session_ticketsonoff
  • 尝试使用Strict-Transport-Security
  • 尝试/etc/letsencrypt/options-ssl-nginx.conf使用 certbot 进行评论
  • 尝试了不同的 HTTP 到 HTTPS 重定向设置
  • 我确保在测试时使用私人标签,以确保我没有看到某种错误的缓存访问网站的尝试。
  • 每次我对配置文件进行更改时,我都会重新加载并重新启动服务 nginx。
  • 我做了很多工作sudo reboots以确保这不是一个简单的重启问题。

作为最后的手段,我甚至不惜重装操作系统,重新设置服务器。但还是不行。我没有复制配置文件,我手动执行了每个命令,并仔细修改了配置文件,以确保不会带来之前设置带来的任何问题。这也意味着我从 Let's Encrypt 发出了新的 SSL 请求(使用 cerbot)。虽然我不知道他们是生成了新的还是将上次的那个发送给您。

编辑1:我想在这里随便说说。我真的不知道高级网络,但也许伊朗审查防火墙的某些东西干扰了 SSL 连接,导致 Apple 设备无法建立连接。我听说 Apple 有自己的严格要求,需要特定的 SSL 连接,而不像 Chrome 和 Firefox。这两个浏览器可能会忽略一个小错误,但 Apple 设备不会。

编辑2:我在 Wireshark 窃听时检查了 Safari。似乎无论我做什么,都只交换了几个数据包。此外,尽管我在 nginx 配置中禁用了 TLSv1.0,但 Safari 似乎仍在使用 TLSv1.0。我真的不知道如何完全关闭它,这样 Safari 就不会尝试使用它与服务器通信。

编辑3:我尝试使用不同的 SSL(使用 comodo 的 3 个月免费 SSL 试用程序),但问题仍然存在...我读到一些人说他们在更改 SSL 后解决了一些类似的问题。我不知道为什么它对我不起作用。

编辑4:我决定更改域名的 DNS 服务器,看看是否是 DNS 问题。我不知道为什么以及如何更改它们,但在我更改它们之后,Safari 可以短暂地加载网站。但过了一段时间它又停止工作了。

编辑5:禁用我的网站中的外部脚本代码(如 Google Analytics,因为它们的服务对伊朗人来说有点被屏蔽了)没有成功。我再次看到人们的报告,暗示有些人通过禁用外部脚本解决了他们的问题。

编辑6:我开始相信这不是我这边的网络或服务器配置问题。这看起来确实像是第三方干扰了请求。我不知道 Apple 如何处理网络,但我认为 Apple 的连接/打包协商正在引发某种危险信号,这导致伊朗审查/防火墙断开客户端连接。

编辑7:我甚至更改了服务器的数据中心,并使用了新的 IP 地址。问题仍然存在 :(

编辑8:这是/var/log/nginx/error.log设置为 时的输出debug。当我从 Safari 客户端发起请求时,它会显示这些行。

nginx error.log 输出

我确实尝试禁用 php fpm 以确保这不是 php 瓶颈问题。我还尝试调整一些随机参数,例如增加net.core.somaxconn1024增加backlogphp fpm 配置文件。此外,当我使用 everythink 观察系统时,htop一切看起来都很正常,没有 CPU 使用率峰值,也没有特定进程跳到列表顶部。

编辑9:我将 Nginx 换成了 Apache2,检查是否是 Web 服务器的问题。结果不是。

答案1

既然您怀疑您和网站之间的代理,您可以使用 ssh 中的 -L 选项绕过它吗?它将在您和您的网站之间提供一个安全隧道,代理无法更改。

例如,在桌面上执行此操作:ssh -L 2222:127.0.0.1:443[电子邮件保护]

此命令登录到你的服务器后,在同一桌面上启动浏览器即可https://127.0.0.1:2222

如果您现在看到您的网站及其 SSL 证书,则一切都设置正确 - 当您不使用隧道时,中间有人会更改您的 SSL 连接。

答案2

成立这是解决我问题的临时方法。我刚刚将服务器移至其他托管/数据中心!

更新:实际上,几个月后问题又再次出现......我真的不知道是什么技术问题导致了这个问题或者如何解决它。

更新 2:我与一位 IT 网络专家进行了交谈,他们告诉我,该问题实际上在于政府防火墙规则选中了我的域名(虚假/错误审查),并且无论我使用什么网络服务器配置或网络托管,它都会被我无法触及的防火墙阻止。

答案3

这可能只是证书的问题,您是否正确设置了 SubjectAlternativeName?仅使用 SubjectName 作为 DNS 名称的做法已被弃用。您是否使用证书固定、OSCP 装订、HSTP 和其他相对较新的 TLS 设置?这可能会在受监管的网络上引起问题。

一些互联网用户需要使用带有 SSL 检查的代理。许多企业环境使用类似于 IronPort 或 Bluecoat 的产品来检测隐蔽通道和恶意软件,作为其安全策略的一部分。实现此目的的方法源自地下杂志 Phrack 76 中的一篇文章。它归结为一个简单的设置,其中每个客户端都有一个它信任的代理的额外 CA 根证书,代理依次代表每个客户端重新启动连接,麻省理工学院“打开 SSL”,伊朗和中国等国家监控整个互联网。因此没有 PFS,并且几个取决于客户端检查服务器加密的事情可能会失败,因为它被更改或 SSL 甚至被完全删除。如果您不关心它,那么您可以通过删除上述选项将服务器证书设置降级为“导出质量”。

答案4

@austin-dixon 的回答是正确的。该测试必须在用户所在的同一国家/地区进行,如果您不在该国家/地区,这可能不是一个选择。

您至少可以使用 Qualys SSL 测试来验证配置https://www.ssllabs.com/ssltest/。在这种情况下,字母分数并不重要,只需向下滚动到“握手模拟”并查看 Apple 设备在正常情况下的预期表现。

不管怎样,这都证实了你已经怀疑的事情,即这些用户和网站之间存在某种关系。除了完全禁用 HTTPS 之外,开发人员没有太多方法可以解决这种情况。中间人可能需要一些比服务器配置的更弱的密码套件或更低的 TLS 版本,但我不知道在这种情况下该建议哪些。

相关内容