Действительно, 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
вместо)