curl: как указать целевое имя хоста для запроса https - PullRequest
0 голосов
/ 10 мая 2018

У меня есть x.example, который обслуживает трафик для a.example и b.example. x.example имеет сертификаты для a.example и b.example. DNS для a.example и b.example еще не настроен.

Если я добавлю запись /etc/hosts для a.example, указывающую на ip x.example и запусту curl -XGET https://a.example, я получу 200.

Однако, если я запускаю curl --header 'Host: a.example' https://x.example, я получаю:

curl: (51) SSL: альтернативное имя субъекта сертификата не соответствует цели имя хоста x.example

Я бы подумал, что он будет использовать .example в качестве хоста. Может быть, я не понимаю, как работает SNI / TLS.

Поскольку a.example - это HTTP-заголовок, к которому у TLS-рукопожатия еще нет доступа? Но сам URL, к которому он имеет доступ?

1 Ответ

0 голосов
/ 10 мая 2018

Действительно, SNI в TLS не работает так.SNI, как и все, что связано с TLS, происходит перед любым видом HTTP-трафика, поэтому заголовок Host не учитывается на этом этапе (но позже будет полезно, чтобы веб-сервер знал, к какому хосту вы подключаетесь).

Таким образом, чтобы включить SNI, вам нужен определенный переключатель в вашем HTTP-клиенте, чтобы он отправлял соответствующее расширение TLS во время квитирования с нужным вам значением имени хоста.

В случае curlвам нужна как минимум версия 7.18.1 (на основе https://curl.haxx.se/changes.html), а затем она автоматически использует значение, указанное в заголовке Host. Это зависит от того, какая версия OpenSSL (или эквивалентная библиотека на вашей платформе)он связан с.

См. пункт 1.10 из https://curl.haxx.se/docs/knownbugs.html, который говорит об ошибке, но объясняет, что происходит:

Когда ему дается URL с конечной точкой длячасть имени хоста: "https://example.com./", libcurl удалит точку и будет использовать имя без точки внутри и отправит его без точки в заголовках HTTP Host:: и в файле SNI TLSполе.

Параметр --connect-to также может быть полезен в вашем случае.Или --resolve в качестве замены /etc/hosts, см., Например, https://curl.haxx.se/mail/archive-2015-01/0042.html, или https://makandracards.com/makandra/1613-make-an-http-request-to-a-machine-but-fake-the-hostname Вы можете добавить --verbose во всех случаях, чтобы увидеть более подробно, что происходит.Смотрите этот пример: https://www.claudiokuenzler.com/blog/693/curious-case-of-curl-ssl-tls-sni-http-host-header;вы также узнаете, как выполнить непосредственное тестирование с помощью openssl.

. Если в вашем /etc/hosts есть a.example, просто запустите curl с https://a.example/, и он должен позаботиться о Hostзаголовок и, следовательно, SNI (или используйте --resolve вместо)

...