5

我试图让 h2 (HTTP/2) 在我的网络服务器上工作。通过“ondrej”存储库安装了 Apache 2.4.20。我在 Debian 8 和 Ubuntu 14.04 服务器上进行了测试,但我一直遇到同样的问题。我正在运行 OpenSSL 1.0.2 和 SSL 虚拟主机。

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

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

遗憾的是我无法使用 cUrl 进行测试,因为我可以访问的服务器不支持任何支持 HTTP/2 的版本。

我的 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。

谁能告诉我怎么了?

4

4 回答 4

8

最后我让它工作了。将“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+ 顺便说一句。

于 2016-05-24T18:57:46.473 回答
2

您无法升级h2协议。

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

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

此外,虽然 HTTP/2 协议本身允许通过 HTTP/1.1 升级到明文通信h2c(注意c协议名称末尾的ALPN 协商。

总之:

  • 您可以从 HTTP/1.1 升级到 HTTP/2 明文 ( h2c),但只能使用非浏览器客户端,例如nghttp。这是解释here
  • 升级机制仅由客户端发起,它们将发送UpgradeandHTTP2-Settings标头,而不是服务器。
  • 浏览器仅支持通过 ALPN ( ) 协商 HTTP/2 h2。这意味着您不能在浏览器和服务器之间使用明文 HTTP/2。
于 2016-05-19T13:22:20.300 回答
2

前叉

您提到过,您使用prefork mpm。如果配置了 prefork mpm,Apache 网络服务器将不会使用 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 提供请求。


更多信息

于 2019-01-08T16:52:52.667 回答
1

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

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

您知道哪些 cipherSuite-entries 确实阻止了 HTTP2(ALPN 不可用)吗?

于 2016-05-25T11:12:54.967 回答