在我的网络服务器上,我试图让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。
谁能告诉我出了什么问题?
答案 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升级机制是由客户端启动的。
如果我理解正确,并且您尝试将Upgrade
和HTTP2-Settings
标头从服务器发送到客户端,那么这没有意义。客户端发送这些标头,而不是服务器。
此外,虽然HTTP / 2协议本身允许通过HTTP / 1.1升级到h2c
进行明文通信(请注意协议名称末尾的c
),但浏览器供应商已经未实现此机制,仅在ALPN协商后使用HTTP / 2协议。
总结:
答案 2 :(得分:2)
您提到,您使用的是 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服务请求。
答案 3 :(得分:1)
我有同样的问题,所以我尝试了你的“解决方案”。 但是使用这个cipherSuite-Code大多数IE,Androids和Safari都会因为“handshake_failure”而被阻止!
它在https://www.ssllabs.com/ssltest/analyze.html
上作了测试您知道哪个cipherSuite条目阻止了HTTP2(ALPN不可用)吗?