为什么Chrome浏览器无法识别我的http2服务器?

10

我按照 Digital Ocean文档 配置了我的Nginx,现在支持http2。

但是在Chrome(版本54.0.2840.98(64位))的开发者工具中,它总是显示HTTP 1/1:

NAME             METHOD  STATUS  PROTOCOL
shell.js?v=xx..    GET    200     http/1/1

我的服务器运行的是Ubuntu 16.04 LTS操作系统,支持ALPN和NPN协议,并且其自带的openssl版本为1.0.2g。

我使用这个工具网站确认了HTTP2的支持情况,结果为:

Yeah! example.com supports HTTP/2.0. ALPN supported...

使用curl命令进行检查也是可以的:

 $ curl -I --http2 https://www.example.com
  HTTP/2 200 
  server: nginx/1.10.0 (Ubuntu)
  date: Tue, 13 Dec 2016 15:59:13 GMT
  content-type: text/html; charset=utf-8
  content-length: 5603
  x-powered-by: Express
  cache-control: public, max-age=0
  etag: W/"15e3-EUyjnNnyevoQO+tRlVVZxg"
  vary: Accept-Encoding
  strict-transport-security: max-age=63072000; includeSubdomains
  x-frame-options: DENY
  x-content-type-options: nosniff

我还使用控制台上的is-http2命令行工具进行了检查:

is-http2 www.amazon.com
× HTTP/2 not supported by www.amazon.com
Supported protocols: http/1.1

is-http2 www.example.com
✓ HTTP/2  supported by www.example.com
Supported protocols: h2 http/1.1

为什么Chrome无法识别它?

我如何在Safari(v 10.0.1)中也检查它?


Stack Overflow 是用于编程问题的。服务器软件支持最好在 Server Fault 上处理(但请先阅读他们的规则!)。 - Colonel Thirty Two
好的,谢谢。我不知道这件事...我把我的问题挪过去了...然后我会关闭那一个。 - user762579
3个回答

31

可能有两个原因:

  1. 您正在使用反病毒软件,它会MITM您的流量,因此将您降级到HTTP/1.1。关闭AV上的https流量监控以直接连接到服务器。您可以使用在线工具测试您的网站是否支持HTTP/2来检查是否是这种情况。

  2. 您正在使用较旧的TLS密码套件,特别是Chrome不允许用于HTTP/2的密码套件(https://http2.github.io/http2-spec/#BadCipherSuites),如上面指南的第5步所述。使用https://www.ssllabs.com/ssltest/扫描您的站点以检查您的TLS配置并进行改进。

第三个原因是您的SSL/TLS库不支持ALPN(例如,您正在使用openssl 1.0.1,需要使用1.0.2或更高版本),但您已经确认您具有ALPN支持,因此本答案跳过此原因。

@BassaDP,谢谢...我已经评论了你的答案(我正在运行一个反病毒程序,将我的example.com域名排除在外解决了这个问题).. 很抱歉重复发布这个问题,因为Colonel thirty Two建议这样做! - user762579
3
我可以确认,这可能是由于某人的反病毒软件引起的。在我的情况下,是eset导致了这个问题。在“Web Access Protection”->“Web Protocols”下禁用“启用HTTPS检查”允许http/2工作(不幸的是,将地址添加到白名单中似乎无法解决问题)。 - fr0x
Bitdefender(免费版)也会导致这个问题。更糟糕的是,它没有提供关闭仅限https保护的选项。 - cdalxndr

0

-1
在我的情况下,Chrome 在 chrome-net-export-log.json 文件中生成了以下摘录。
HTTP2_SESSION_RECV_INVALID_HEADER
--> 错误 = "标题名称中有无效字符。"
--> 标题名称 = "x-xss-protection:"
--> 标题值 = "1; mode=block"


从标题名称中删除 : 后,问题得到解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接