如何手动连接到我的 Web 服务器并发送带有主机名的 TLS 握手,然后发送带有不同主机名的 HTTP 请求标头

如何手动连接到我的 Web 服务器并发送带有主机名的 TLS 握手,然后发送带有不同主机名的 HTTP 请求标头

我的 Apache Web 服务器日志出现可怕的错误:

[ssl:error] AH02032: Hostname www.example.com provided via SNI and
 hostname example.com provided via HTTP are different

我知道这意味着什么以及为什么会发生

我需要手动重现日志中的错误。这就是我所要求的。

我该怎么做?

更具体地说,我需要查看我的 Web 服务器升级是否仍记录这些事件,如果是,则采取措施将它们从我的日志文件中过滤掉。

我知道的是:我需要在 TLS 握手中www.example.com向我的 Web 服务器发送一个主机名,例如(SNI 应该由 Web 服务器自动处理)。然后example.com在 HTTP 标头中发送一个不同的主机名,例如。

我熟悉 telnet / openssl 等,但不知道从哪里开始弄清楚这些命令。

第一次尝试这样做:

我已经接近了,但由于某种原因,错误不同,并且只在第一次出现:

$ openssl s_client -crlf -connect www.example.com:443

> GET / HTTP/1.1
> Host: example.com
> [ENTER]
[Sat Mar 05 17:31:35.958118 2022] [ssl:error] [pid 512:tid 139776568080128]
[client 10.0.0.100:37982] AH02032: Hostname www.example.com provided via SNI
and hostname example provided via HTTP have no compatible SSL setup

请注意,第二个主机名是example,尽管我输入的是example.com

第二次尝试这样做:

$ openssl s_client -crlf -connect www.example.com:443

> GET / HTTP/1.1
> Host: example.com
> [ENTER]

日志文件中没有任何报告,无论是在旧服务器还是新服务器上。我发送的 SNI 主机名(我认为)与 HTTP 主机名不同,所以也许 openssl 客户端自动更正了,这是我所期望的?

答案1

不同之处在于旗帜servername

$ openssl s_client -crlf -connect example.com:443 -servername www.example.com

GET / HTTP/1.1
Host: example.com
[ENTER]

Apache 2.4.6:

[Sat Mar 05 18:13:23.217568 2022] [ssl:error] [pid 22316] AH02032: Hostname
 www.example.com provided via SNI and hostname example.com provided via HTTP
 are different

Apache 2.4.52 不会在日志文件中产生此错误。

而且也man openssl-s_client很有帮助。

相关内容