浏览器不会升级到H2,而是发送"升级"标题

Jor*_*rmn 4 apache ssl http2 alpn

在我的网络服务器上,我试图让H2(http2)工作.通过"ondrej"存储库安装Apache 2.4.20.我在Debian 8和Ubuntu 14.04服务器上测试过,但是我一直遇到同样的问题.我有OpenSSL 1.0.2和SSL vhosts运行.

奇怪的是发送升级头(连接:升级和升级:h2).当我做一些外部服务器测试时,我得到了响应,即在ALPN支持下h2正常运行.但问题是我测试的浏览器(Win7上的Chrome和FireFox)不会升级到H2.

我注意到缺少的一件事是HTTP2-Settings标头,但我在任何Apache文档中都找不到任何实现此功能或强制Apache发送此标头的内容.

遗憾的是我无法使用cUrl进行测试,因为我可以访问的服务器不支持任何具有http2支持的版本.

我的SSL vhost设置:

Protocols h2 http/1.1
SSLEngine On
SSLCACertificateFile xxxxxxxx
SSLProtocol all -SSLv2 -SSLv3
SSLCompression Off
SSLHonorCipherOrder On
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RSA+AES RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4 !AES128"
Header always set Strict-Transport-Security "max-age=15552000;includeSubDomains"
SSLCertificateFile xxxxxxxx
SSLCertificateKeyFile xxxxxxxx
Run Code Online (Sandbox Code Playgroud)

我正在使用prefork模块运行Apache而不是使用worker.

谁能告诉我什么是错的?

Jor*_*rmn 9

最后我开始工作了.这是将"SSLChiperSuite"更改为此字符串的问题:

SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-A $

旧的 - 可以说 - 一个阻止http2的选项.我的SSL测试评级仍为A + btw.


sbo*_*det 6

您无法升级到该h2协议。

HTTP/1.1的升级机制是由客户端发起的。

如果我理解正确,并且您尝试将UpgradeHTTP2-Settings标头从服务器发送到客户端,那么这是没有意义的。客户端发送这些标头,而不是服务器。

h2c此外,虽然 HTTP/2 协议本身允许通过 HTTP/1.1 升级到(注意协议名称末尾的 )进行明文通信c,但浏览器供应商尚未实现此机制,仅在升级后才使用 HTTP/2 协议。 ALPN 协商。

总之:

  • 您可以从 HTTP/1.1 升级到 HTTP/2 明文 ( h2c),但仅限于非浏览器客户端,例如nghttp这里对此进行解释。
  • 升级机制仅由客户端发起,并且它们将发送UpgradeHTTP2-Settings标头,而不是服务器。
  • 浏览器仅支持通过 ALPN ( ) 进行 HTTP/2 协商h2。这意味着浏览器和服务器之间无法使用明文 HTTP/2。