无法向 Apache 服务器发出 http2 请求,尽管服务器在响应标头中发送“升级:h2”

Posted

技术标签:

【中文标题】无法向 Apache 服务器发出 http2 请求,尽管服务器在响应标头中发送“升级:h2”【英文标题】:Unable to make http2 requests to an Apache Server, though the server sends "Upgrade:h2" in response headers 【发布时间】:2017-05-21 03:01:10 【问题描述】:

我已经为 Apache Web 服务器启用了 mod_http2,并在 conf 中进行了必要的更改,仍然从浏览器向服务器发出的任何请求都遵循 http/1.1 协议

服务器发送 Upgrade:h2 头字段,但浏览器仍继续发出 http/1.1 请求。

如何从 Mozilla/Chrome 发出 h2 请求? 我正在使用 Mozilla Firefox 48.0

【问题讨论】:

您在运行防病毒软件吗? ***.com/questions/41116072/… 你用的是什么密码套件? 一切正常文件,而我在 MAC 上使用 Safari 时,我的 windows 机器上的 firefox 显示 NS_ERROR_NET_INADEQUATE_SECURITY,这肯定与所使用的密码套件有关。 请注意,Upgrade 标头是 HTTP 请求标头,而不是响应标头!将此标头作为响应标头发送是bug in older versions of Apache。它会导致客户端在收到服务器响应中的请求标头时感到困惑。 【参考方案1】:
    检查是否在 Firefox 中启用了 HTTP/2 支持:

在 Firefox 的地址栏中,输入“about:config”,然后搜索“network.http.spdy.enabled.http2”并确保设置为 true。

    Firefox 仅在 TLS 上实现 HTTP/2

因此,您必须使用https://xxxxx 访问该网站

【讨论】:

嗨 Nidhi,我检查了 network.http.spdy.enabled.http2 参数是否设置为 true,我也在使用 TLS。浏览器在某些网站上发出“h2”请求,例如谷歌搜索,因此它肯定与浏览器无关。【参考方案2】:

浏览器目前仅通过https 支持 HTTP/2。请参阅http://caniuse.com/#feat=http2 注释编号 2。

【讨论】:

【参考方案3】:

HTTP/2 标准对 https 提出了一些额外要求,不得使用来自指定 black list 的密码。

一个可接受的 Apache SSL 配置是:

SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK
SSLProtocol All -SSLv2 -SSLv3

这需要在 httpd 配置文件中更改,并且 NS_ERROR_NET_INADEQUATE_SECURITY 不应在 httpd 重启后发生。

【讨论】:

以上是关于无法向 Apache 服务器发出 http2 请求,尽管服务器在响应标头中发送“升级:h2”的主要内容,如果未能解决你的问题,请参考以下文章

无法向本地服务器发出 HTTPS 请求

无法向会话状态服务器发出会话状态请求

无法向会话状态服务器发出会话状态请求。

无法向会话状态服务器发出会话状态请求

在后台接收静默推送时无法向 Alamofire 发出请求

如何在 Go 中通过 http:// 发出仅 HTTP2 的请求?