HTTPS不适用于Safari


16

我有一个EC2实例,其中Apache作为Web服务器(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)"

我在/ etc / httpd / logs / error_log和/ etc / httpd / logs / access_log中以及在Safari控制台中都没有找到解决问题的任何提示。这就是我所学知识的发展程度:-(任何提示如何跟踪此问题的提示将不胜感激。

Answers:


22

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

鉴于浏览器始终不支持不带TLS的HTTP / 2,并且基于TLS的HTTP / 2不需要升级标头,因此建议您将该配置替换为

Protocols h2 http/1.1

这将禁用对不带TLS的不需要的HTTP / 2的支持,但希望以此方式摆脱Upgrade标头,因为仅从纯HTTP升级到纯HTTP / 2才需要此标头。

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

Header unset Upgrade

3
谢谢!我确实具有以下配置: # Enable HTTP/2 by default # 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删除标头。不能说我对这里发生的事情/为什么如此
感到十分满意,

@jola:感谢您的反馈。我已将其包含在答案中。
斯蒂芬·乌尔里希

3

我认为这是Safari问题,而不是AWS / SSL问题。在Google上搜索该错误会得到很多结果。

一切都根据SSL Shopper测试在网站上签出,并且 SSL Labs测试

我找到了解决该问题的方法。

解决方案是进入“隐私”下的“ Safari首选项”并列出所有“详细信息”。这提供了使用过cookie等所有站点的日志。我找到了“天气网络”域页面,并从中清除了所有内容。然后,我可以重新加载“天气网络”页面,而没有任何问题。我认为这将适用于其他类似的单一站点。

还有可能与Apache进行。


是的,我已经在Google上进行了搜索,但未找到任何直接适用的内容(afaiu)。我已经阅读了Nginx的建议解决方案,但不确定如何/如果适用于apache。
约拉

Apache无疑将能够删除Nginx所做的所有“ Upgrade”标头
蒂姆(Tim)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.