Почему curl использует HTTP/1.1, а не HTTP/2 на Mac?

Согласно этому 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

но запуск curl на URL-адресе с поддержкой HTTP2 (например, тест с 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?


person Snowcrash    schedule 05.07.2017    source источник


Ответы (2)


Вы можете собрать curl для использования одной из множества различных библиотек TLS/SSL, каждая из которых имеет немного разные наборы функций и предлагает немного разные условия для работы с curl.

Завиток, который вы показываете в своих списках вопросов, указывает SecureTransport как библиотеку TLS, для использования которой он был создан, родную библиотеку TLS для macOS.

Secure Transport просто не предоставляет curl необходимых средств для согласования HTTP/2 через TLS — или, по крайней мере, не предоставляет, так как мне сказали, что самая последняя версия теперь поддерживает ALPN, поэтому будущая версия curl должна иметь возможность делайте HTTP/2 через TLS даже с безопасным транспортом.

В дополнение к правильному согласованию TLS, curl также должен говорить по HTTP/2, что он делает благодаря использованию почтенной библиотеки nghttp2, так что это вторая зависимость, которая должна присутствовать, чтобы curl мог говорить по HTTP/2. При наличии nghttp2 curl может фактически передавать HTTP/2 по HTTP с открытым текстом, даже если библиотека TLS не может правильно согласовать ALPN.

Исправить?

В более поздних версиях macOS поставляется curl со встроенной поддержкой libreSSL и HTTP/2.

Если вместо этого вы решите пересобрать curl с другой библиотекой TLS, такой как OpenSSL, GnuTLS или NSS, он уже сегодня может нормально работать с HTTP/2 через HTTPS.

person Daniel Stenberg    schedule 05.07.2017
comment
К вашему сведению, функция включения согласования HTTP/2 в SecureTransport — SSLSetALPNProtocols. Он доступен на iOS 11+ и macOS 10.13+. - person Guillaume Algis; 22.03.2018
comment
Тем временем Apple переключилась и теперь поставляет curl, созданный для использования libressl... - person Daniel Stenberg; 22.03.2018
comment
Ой. Не знал этого. Это... удивительно. - person Guillaume Algis; 22.03.2018

В MacOS Sierra именно так вы можете установить обновленный curl, поддерживающий HTTP2, используя OpenSSL вместо SecureTransport.

  1. brew reinstall curl --with-openssl --with-nghttp2
  2. brew link curl --force
  3. Перезапустить терминал
  4. 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 Дата выпуска: 14 июня 2017 г. Протоколы: файл 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-proxy

Я должен отметить, что второстепенные обновления MacOS иногда перезаписывают используемую версию curl. Если это произойдет, просто повторно запустите brew link curl --force и перезапустите терминал, чтобы вернуться к доморощенной версии с поддержкой HTTP2.

person Chris    schedule 05.07.2017
comment
Примечание: macOS High Sierra поставляется с curl 7.54.0 и имеет встроенную поддержку HTTP2. - person Chris; 24.07.2018