配置 NGINX SNI 以使用不同于 header 和 'Host'
Configure NGINX SNI to use different header than 'Host'
我有一个启用了 SNI 的有效 NGINX 配置,我能够根据传入请求为两个不同的 SSL 证书提供服务器 Host header.
我需要的是能够将 NGINX 配置为使用不同的 header 而不是使用 Host 为此 'routing' 完成基于header。有谁知道这是否可能?
主机 header 不用于确定您从服务器获得的证书。
TLS 握手以 ClientHello 开始,您的客户端提供主机名 (SNI) 作为握手的一部分。然后服务器以正确的证书响应。 (对于 NGINX,如果您请求它不知道的服务器名称,它将使用其配置中定义的第一个证书进行响应。)
TLS 设置后,您的客户端发出一个包含 Host
header 的 HTTP 请求。通常,这将匹配 ClientHello 的 SNI 部分。
您正在测试的客户端很可能采用了您正在设置的 Host
header 并使用它来为 TLS 握手设置 SNI,但它们是不相关的,甚至不需要匹配。
为了说明这一点,您可以使用 openssl s_client -connect <server_ip>:443 -servername Test1
然后发送以下请求:
GET / HTTP/1.1
Host: Test2
您甚至在发出 HTTP 请求之前就会看到您获得了 Test1
的证书。服务器将从 Test2
发回响应。瞧,证明 Host
header 没有按照您的想法行事。
你可以滥用 NGINX 来使用 Host 之外的任意 header,但这并不能解决客户端 SNI 问题。请参阅此答案,了解根据请求 body 使用 proxy_pass
的示例,并将其修改为使用 header 代替:nginx conditional proxy pass
我有一个启用了 SNI 的有效 NGINX 配置,我能够根据传入请求为两个不同的 SSL 证书提供服务器 Host header.
我需要的是能够将 NGINX 配置为使用不同的 header 而不是使用 Host 为此 'routing' 完成基于header。有谁知道这是否可能?
主机 header 不用于确定您从服务器获得的证书。
TLS 握手以 ClientHello 开始,您的客户端提供主机名 (SNI) 作为握手的一部分。然后服务器以正确的证书响应。 (对于 NGINX,如果您请求它不知道的服务器名称,它将使用其配置中定义的第一个证书进行响应。)
TLS 设置后,您的客户端发出一个包含 Host
header 的 HTTP 请求。通常,这将匹配 ClientHello 的 SNI 部分。
您正在测试的客户端很可能采用了您正在设置的 Host
header 并使用它来为 TLS 握手设置 SNI,但它们是不相关的,甚至不需要匹配。
为了说明这一点,您可以使用 openssl s_client -connect <server_ip>:443 -servername Test1
然后发送以下请求:
GET / HTTP/1.1
Host: Test2
您甚至在发出 HTTP 请求之前就会看到您获得了 Test1
的证书。服务器将从 Test2
发回响应。瞧,证明 Host
header 没有按照您的想法行事。
你可以滥用 NGINX 来使用 Host 之外的任意 header,但这并不能解决客户端 SNI 问题。请参阅此答案,了解根据请求 body 使用 proxy_pass
的示例,并将其修改为使用 header 代替:nginx conditional proxy pass