如何在 http 模式下访问代理服务器时启用 TLS?

如何在 http 模式下访问代理服务器时启用 TLS?

我使用 Nginx 服务器作为反向代理。它同时提供 HTTP 和 HTTPS 流量,并将调用分派到多个仅 HTTP 网站。

最近,我希望能够加密 Nginx 和底层服务器之间的流量。Nginx 仍会像以前一样解密从互联网接收的 HTTPS 流量,但随后应使用具有不同证书的 HTTPS 来访问底层服务器。

我开始改变配置,如下官方文档。 然而,proxy_ssl on只能在stream级别内设置,而不是http。 这可以通过显示包含以下错误的nginx -t行来确认:proxy_ssl on;

这里不允许使用“proxy_ssl”指令[...]

我的困难在于我使用 Nginx 来记录流量、添加标头等,因此我必须使用http。如果我的理解正确,stream当使用 Nginx 直接传输 HTTPS 流量而没有解密能力(即 SSL Pass-thru)时,需要 level,而我的情况并非如此。

我可以让 Nginx 通过 HTTPS 连接到底层服务器,同时仍然使用http级别及其所有优点(例如日志记录和更改标头)吗?

当前配置:

http {
    proxy_set_header ... # Logging and custom headers.

    ...

    upstream demo-failover {
        server demo1.example.com:443 weight=1000 max_fails=0;
        server demo2.example.com:443 backup;
    }

    server {
        listen 80 proxy_protocol;
        listen 443 ssl http2 proxy_protocol;
        server_name demo.example.com;

        # HTTPS configuration for public exchange (Internet <-> Nginx).
        ssl_certificate /.../fullchain.pem;
        ssl_certificate_key /.../privkey.pem;

        ssl_stapling on;
        ssl_stapling_verify on;

        # HTTPS configuration for private exchange (Nginx <-> underlying server).
        proxy_ssl on; # This is the line which is invalid.
        proxy_ssl_trusted_certificate /.../ca.pem;
        proxy_ssl_certificate /.../demo.pem;
        proxy_ssl_certificate_key /.../demo.key;
        proxy_ssl_verify on;
        proxy_ssl_verify_depth 2;
        proxy_ssl_session_reuse on;

        if ($scheme = http) {
            return 301 https://$server_name$request_uri;
        }

        location / {
            proxy_pass http://demo-failover;
            proxy_next_upstream error timeout invalid_header;
            proxy_connect_timeout 2;
            proxy_redirect off;
            proxy_http_version 1.1;
        }
    }
}

答案1

找到了。

无需切换到stream,也无需使用proxy_ssl on

另一个例子官方文档中介绍了如何在http级别上使用 HTTPS。诀窍(这是我在尝试删除时犯的错误proxy_ssl on,结果发现 Nginx 尝试使用 HTTP 调用底层服务器)是值proxy_pass。在我的例子中,我保留了原始值:

proxy_pass http://demo-failover;

相反,我应该将其改为https

proxy_pass https://demo-failover;
#              ^

相关内容