根据主机路由SSL请求

我试图根据主机名转发SSL请求到我的机器上运行的子守护进程。 为了实现这样的行为,我试着用nginx做试验,然后nginx会作为一个反向代理/路由器。

我的configuration文件:

# ... location / { proxy_set_header Host $http_host; if ($host = 'hostname01.example.com') { proxy_pass https://127.0.0.1:8001; } if ($host = 'hostname02.example.com') { proxy_pass https://127.0.0.1:8002; } if ($host = 'hostname03.example.com') { proxy_pass https://127.0.0.1:8003; } if ($host = 'hostname04.example.com') { proxy_pass https://127.0.0.1:8004; } if ($host = 'hostname01.example1.com') { proxy_pass https://127.0.0.1:8005; } if ($host = 'hostname01.example2.com') { proxy_pass https://127.0.0.1:8006; } if ($host = 'hostname01.example3.com') { proxy_pass https://127.0.0.1:8007; } if ($host = 'hostname01.example4.com') { proxy_pass https://127.0.0.1:8008; } # ... } 

但是,由于SSL的本质,主机也被encryption。 当试图请求一个URL,我得到OpenSSL: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol 。 让其中一个守护进程听443端口工作正常。

是否有可能使用nginx这种设置? 如果不是,是否有实现这种行为的工具?

每个子服务都使用自己的SSL证书。 一个想法是使用独特的机器为每个服务,让他们听取443本身,但这就是我想要避免的。

任何想法呢?

是否有可能使用nginx这种设置? 如果不是,是否有实现这种行为的工具?

正如您已经注意到的那样,您的反向代理对于URI或HTTP标头一无所知,因为这些信息在TLS协议中被封装和encryption。 基于名称的虚拟主机无法轻松使用TLS 。

这个规则唯一值得注意的例外是TLS的服务器名称指示扩展名,但是这需要服务器以及所有潜在客户端的支持 。 NGNIX在服务器端支持SNI ,但我想它仍然需要终止您的应用程序的TLS连接。 HAproxy 将能够根据SNI提供的主机名做后端决定而不终止隧道 – 也许你想看看。

如果你可以把一个单独的证书作为SAN属性携带所有主机名* .example * .com的组合,你可以用这个证书设置NGNIX来终止所有的隧道,检查这个头部并且传递这个通信量作为反向代理的值。 这种解决scheme有可能得到更多潜在客户的支持 ,但是有明显的缺点,就是每次需要在列表中添加或删除主机名时,都需要重新发布证书。