根据此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?
答案 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。
brew reinstall curl --with-openssl --with-nghttp2
brew link curl --force
curl -V
应该返回以下内容: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启用版本。