事实上,TLS 中的 SNI 并不是这样工作的。 SNI 与 TLS 相关的所有内容一样,发生在任何类型的 HTTP 流量之前,因此Host
该步骤中不考虑标头(但稍后对于网络服务器了解您正在连接的主机也很有用)。
因此,要启用 SNI,您需要在 HTTP 客户端中设置一个特定的开关,告诉它在与您需要的主机名值握手期间发送适当的 TLS 扩展。
的情况下curl
,您至少需要版本7.18.1(基于https://curl.haxx.se/changes.html https://curl.haxx.se/changes.html)然后它似乎自动使用中提供的值Host
标头。它还取决于它链接到的 OpenSSL(或您平台上的等效库)版本。
参见第 1.10 点https://curl.haxx.se/docs/knownbugs.html https://curl.haxx.se/docs/knownbugs.html这谈到了一个错误,但解释了发生的情况:
当给定一个主机名部分带有尾随点的 URL 时:“https://example.com./”,libcurl 将去掉该点并在内部使用不带点的名称,并在 HTTP 主机中将其发送为无点:标头和 TLS SNI 字段中。
The --connect-to
选项对于您的情况也可能有用。或者--resolve
作为替代/etc/hosts
, see https://curl.haxx.se/mail/archive-2015-01/0042.html 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 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 https://www.claudiokuenzler.com/blog/693/curious-case-of-curl-ssl-tls-sni-http-host-header;您还将看到如何直接测试openssl
.
如果你有a.example
在你的/etc/hosts
你应该只运行curlhttps://a.example/
它应该照顾Host
标头和 SNI(或使用--resolve
反而)
因此,要直接回答您的问题,请替换
curl --header 'Host: a.example' https://x.example
with
curl --connect-to a.example:443:x.example:443 https://a.example
它应该可以完美地工作。