如何让 nginx 为多个虚拟主机做 SSL 透传?

Posted

技术标签:

【中文标题】如何让 nginx 为多个虚拟主机做 SSL 透传?【英文标题】:How to let nginx do SSL pass-through for multiple virtual hosts? 【发布时间】:2019-12-10 19:43:51 【问题描述】:

我有多个本地 https 服务器在不同的端口上运行,并拥有自己的证书。现在,我想使用 nginx 使这些 https 服务器在不同的主机名下可用,端口 443 和 ssl 安全。

我当前每个主机名的配置看起来像

server 
    listen       443 ssl;
    server_name  hostname1;

    ssl_certificate     /etc/nginx/hostname1.cert.pem;
    ssl_certificate_key /etc/nginx/hostname1.privkey.pem;

    location / 
        proxy_pass ...
    

但是使用listen 443 ssl; 指令会强制我指定证书和密钥。相反,我想简单地从我的服务器传递该流量,因此我不必在 nginx 中维护二级证书,并且我的本地环境更接近生产环境。

针对单个服务器,F.X.在SSL Pass-Through in Nginx Reverse proxy? 中提供流的解决方案 但是,正如他/她所指出的,由于它只是转发 TCP,因此无法查看主机名并使其适用于多个服务器。

还有其他方法吗? 是否有一些基本的限制,这不能工作?

【问题讨论】:

【参考方案1】:

这里的神奇概念是Server Name Indication,这是一个 TSL 扩展,它在 TSL Client Hello 中添加客户端所需的主机名,并允许服务器将连接映射到多个虚拟主机之一。

事实证明,F.X. 的答案。已经过时了,Dave T. 有a solution 使用两个较新的 nginx 模块,ngx_stream_ssl_preread 和 ngx_stream_map。有关详细信息,请参阅他在此网络上的回答。

【讨论】:

以上是关于如何让 nginx 为多个虚拟主机做 SSL 透传?的主要内容,如果未能解决你的问题,请参考以下文章

如何自动化nginx负载 多个docker

nginx 配置SSL(单向/双向认证)

nginx如何自动添加域名端口?

Nginx实现多级反向代理客户端IP透传

如何在 nginx 中使用动态 SSL 配置配置动态虚拟主机?

Nginx多级反向代理下的IP透传