nginx HTTPS/SSL 反向代理:如何传递证书?

nginx HTTPS/SSL 反向代理:如何传递证书?

我正在尝试将具有多个 Web 服务器的旧基础设施转换为具有单个公共 IP 地址的虚拟化环境。

所有服务器的流量都相对较低,因此性能不是问题。

我目前已在防火墙/堡垒主机上直接安装了 nginx,以反向代理到一些服务器(目前为三台)。

我已使用纯 HTTP 完成了所有工作。

我当前的 HTTP 配置是(简化):

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen 80;
        server_name mydom.com www.mydom.com;
        location / {
            proxy_pass http://192.168.99.20:80;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

    server {
        listen 80;
        server_name redmine.mydom.com git.mydom.com;
        location / {
            proxy_pass http://192.168.99.30:80;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

    server {
        listen 80;
        server_name mail.mydom.com email.mydom.com webmail.mydom.com;
        location / {
            proxy_pass http://192.168.99.10:80;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}

问题是:我应该如何配置 nginx 来转发 HTTPS/SSL?

我尝试了一些类似的事情:

server {
    listen       443 ssl;
    server_name mydom.com www.mydom.com;
    location / {
        proxy_pass https://192.168.99.20;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

但由于缺少 ssl_... 节,这不起作用。

“真实”(代理)服务器已经有其证书,但 nginx 似乎需要“本地”证书(我不想提供)。

在这种情况下,“最佳实践”是什么?

注意:如上所述,我需要在防火墙(IPFire)上部署反向代理,因此我的选择相当有限;nginx 和 haproxy 受支持,sniproxy 不受支持。

答案1

尝试哈普罗西

我成功地使用了它。我将所有传入流量转发到 haproxy VM,然后它将 SSL 连接传送到在其他 VM 中运行的网站。

这是一个好的开始使用 haproxy

答案2

即使没有在 nginx 上安装证书,您也可以使用流模块执行此操作。这样,nginx 就充当了 TCP 代理,而您失去了根据 HTTP 内容(标头、cookie 等)采取行动的能力。

您可以从官方文档中了解更多信息:

https://www.nginx.com/resources/admin-guide/tcp-load-balancing/

https://nginx.org/en/docs/stream/ngx_stream_core_module.html

答案3

我不认为 nginx 有能力做到这一点,但我遇到了sniproxy它似乎被设计用来通过启动 SNI 握手来识别所需的主机名,然后将其传递给正确的服务器,而不需要实际的密钥或证书。

由于它需要 SNI,因此从 XP 上的 IE 和其他不支持它的旧客户端与它的连接将会失败。

相关内容