浏览器不会升级到H2,尽管发送了“升级”标题

时间:2016-05-19 11:53:56

标签: 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虚拟主机设置:

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

我使用prefork模块运行Apache而不是使用worker。

谁能告诉我出了什么问题?

4 个答案:

答案 0 :(得分: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。

答案 1 :(得分:2)

您无法升级h2协议。

HTTP / 1.1升级机制是由客户端启动的。

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

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

总结:

  • 您可以从HTTP / 1.1升级到HTTP / 2明文(h2c),但仅适用于非nghttp等非浏览器客户端。这解释为here
  • 升级机制仅由客户端启动,他们将发送UpgradeHTTP2-Settings标头,而不是服务器。
  • 浏览器仅支持通过ALPN(h2)协商HTTP / 2。这意味着您无法在浏览器和服务器之间使用明文HTTP / 2。

答案 2 :(得分:2)

prefork

您提到,您使用的是 prefork mpm。如果配置了prefork mpm,Apache Web服务器将不使用HTTP / 2,它将默认返回HTTP 1.1。

*"Disable and give warning when mpm_prefork is encountered. The server will 
continue to work, but HTTP/2 will no longer be negotiated."* ([Apache Revision 
: SECURITY: CVE-2017-9789: Read after free in mod_http2.][1])

虽然在提出问题时这可能有效,但这不会    目前正在工作。使用其他的mpm或切换到php-pm和worker或event。


HTTPS

如答案之一中所述,加密可能是一个问题。应该为HTTPS正确配置服务器,并且应该通过HTTPS服务请求。

答案 3 :(得分:1)

我有同样的问题,所以我尝试了你的“解决方案”。 但是使用这个cipherSuite-Code大多数IE,Androids和Safari都会因为“handshake_failure”而被阻止!

它在https://www.ssllabs.com/ssltest/analyze.html

上作了测试

您知道哪个cipherSuite条目阻止了HTTP2(ALPN不可用)吗?