HTTPS 不适用于 Safari

jol*_*ola 17 ssl https safari

我有一个 EC2 实例,Apache 作为网络服务器(和 Wildfly 作为应用服务器,虽然我不确定它与这个问题有什么关系)。在 EC2 前面,我有一个负载均衡器,它终止 HTTPS 并应用 SSL 证书。

HTTP 和 HTTPS 在 Chrome 中都可以正常工作,但不幸的是在 Safari 中不行。访问http://test.papereed.com工作正常,但访问https://test.papereed.com会出现错误

"Safari can't open the page. The error is "The operation couldn't be completed. Protocol error" (NSPOSIXErrorDomain:100)"
Run Code Online (Sandbox Code Playgroud)

我查看了 /etc/httpd/logs/error_log 和 /etc/httpd/logs/access_log 以及 Safari 控制台,但没有找到解决问题的任何提示。这就是我的知识有多远:-( 任何有关如何追踪此问题的提示将不胜感激。

Ste*_*ich 24

curl(如果使用 HTTP/2 支持编译)会出现同样的问题,但会显示原因:

http2 错误:收到无效的 HTTP 标头字段:帧类型:1,流:1,名称:[升级],值:[h2,h2c]

看起来您的服务器正在提供对 HTTP/2 的升级,即使连接已经通过 HTTP/2 完成 - 这没有任何意义。不仅如此,它是明确禁止的。来自RFC 7540 第 8.1.2.2 节

端点不得生成包含特定于连接的头字段的 HTTP/2 消息;任何包含特定连接头域的消息都必须被视为格式错误(第 8.1.2.6 节)......连接特定的头域,例如 Keep-Alive、Proxy-Connection、Transfer-Encoding 和Upgrade

它给我找了一个错误,因为 Apache 不应该用 HTTP/2 发送这个标头。

我的猜测是你有这样的配置

Protocols h2 h2c http/1.1
Run Code Online (Sandbox Code Playgroud)

鉴于浏览器无论如何都不支持没有 TLS 的 HTTP/2,并且 HTTP/2 over TLS 不需要 Upgrade 标头,我建议您将此配置替换为

Protocols h2 http/1.1
Run Code Online (Sandbox Code Playgroud)

这禁用了对没有 TLS 的不需要的 HTTP/2 的支持,但应该希望以这种方式摆脱 Upgrade 标头,因为这仅在从纯 HTTP 升级到纯 HTTP/2 时才需要。

编辑:根据 OP 的评论,更改Protocols配置没有帮助。有必要mod_http2通过删除Upgrade标头来明确解决此行为(即错误):

Header unset Upgrade
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!我确实有以下配置:`# 默认启用 HTTP/2 # https://httpd.apache.org/docs/2.4/mod/core.html#protocols <IfModule mod_http2.c> Protocols h2 h2c http/1.1 < /IfModule>` 按照您的建议并更改为 `Protocols h2 http/1.1` 并没有删除升级标头,因此我保留了协议行并添加了以下内容:`Header unset Upgrade` 以删除标头。不能说我 100% 了解这里发生的事情/原因,但现在它在 Safari 中也能正常工作:-) (4认同)