为什么curl在mac上使用HTTP / 1.1而不是HTTP / 2?

时间:2017-07-05 10:16:16

标签: curl http2 http-1.1

根据此https://curl.haxx.se/docs/http2.html

Since 7.47.0, the curl tool enables HTTP/2 by default for HTTPS connections.

使用自制软件安装最新版本并检查:

curl --version
curl 7.54.1 (x86_64-apple-darwin15.6.0) libcurl/7.54.1 SecureTransport zlib/1.2.5

但在启用HTTP2的网址上运行curl(例如使用https://tools.keycdn.com/http2-test进行测试)我得到:

curl -I http://www.google.co.uk 
HTTP/1.1 200 OK

curl --http2 -v http://www.google.co.uk
curl: (1) Unsupported protocol

知道它为什么使用HTTP / 1.1而不是HTTP / 2?

2 个答案:

答案 0 :(得分:8)

您可以构建curl以使用许多不同的TLS / SSL库中的一个,每个库都具有稍微不同的功能集,并为curl提供稍微不同的条件。

您在问题中显示的curl将SecureTransport列为其构建使用的TLS库,即macOS本机TLS库。

Secure Transport根本没有提供curl通过TLS协商HTTP / 2的必要手段 - 或者至少它没有,因为我被告知最新版本现在支持ALPN所以未来的curl版本应该即使使用安全传输,也能通过TLS进行HTTP / 2。

除了正确的TLS协商之外,curl还需要说HTTP / 2,感谢使用古老的nghttp2库,这是第二个依赖,需要curl才能说HTTP / 2。存在nghttp2时,即使TLS库无法正确协商ALPN,curl实际上也可以通过纯文本HTTP说HTTP / 2。

修正?

如果您选择使用其他TLS库(例如OpenSSL,GnuTLS或NSS)重新构建curl,它现在可以通过HTTPS说HTTP / 2了。

答案 1 :(得分:2)

使用MacOS Sierra,您可以使用OpenSSL而不是SecureTransport来安装支持HTTP2的更新curl。

  1. brew reinstall curl --with-openssl --with-nghttp2
  2. brew link curl --force
  3. 重新启动终端
  4. curl -V应该返回以下内容:
  5.   

    curl 7.54.1(x86_64-apple-darwin16.6.0)libcurl / 7.54.1 OpenSSL / 1.0.2l   zlib / 1.2.8 nghttp2 / 1.24.0发布日期:2017-06-14协议:dict   文件ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp   smb smbs smtp smtps telnet tftp功能:IPv6 Largefile NTLM NTLM_WB   SSL libz TLS-SRP HTTP2 UnixSockets HTTPS代理

    我应该注意,MacOS次要点更新有时会覆盖正在使用的curl版本。如果发生这种情况,只需重新运行brew link curl --force并重新启动终端以切换回自制的HTTP2启用版本。