如何使用 nginx 作为 postgresql TCP 连接的 ssl 反向代理?

如何使用 nginx 作为 postgresql TCP 连接的 ssl 反向代理?

我想要实现的是

[Postgresql 数据库] -- 透明 TCP -- [云端客户端]

[Postgresql 数据库] --透明 TCP --[跳转服务器上的 nginx] --SSL TCP--[云外的客户端]

我想在具有 SSL 参数的流上通过 nginx 反向代理添加额外的 SSL 加密层。

添加的配置nginx.conf是这样的(已经制作了 SSL 证书和密钥)

stream{
        upstream pg{
                server [postgresql server ip]:5432;
        }
        server{
                listen  5430;
                #ssl_preread on;
                ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
                ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
                ssl_certificate /etc/nginx/cert/server.crt;
                ssl_certificate_key /etc/nginx/cert/server.key;
                ssl_session_timeout 2h;
                ssl_verify_client off;
                proxy_pass pg;
        }
}

我尝试了一下telnet [jump server public ip] 5430,连接打开了。但是当我使用 dbeaver 客户端连接到该网关时,它响应“服务器不允许 SSL”。出了什么问题?postgresql 是否知道这个 dbeaver 客户端与 nginx 的连接是 SSL 加密的,并回复了错误消息?

答案1

您无法这样做,因为 PostgreSQL 中的 TLS 不是非 TLS 连接的简单包装器,就像 HTTPS 是 TLS 上的 HTTP 一样。相反,它从一些简单的通信开始,然后升级到 TLS。因此,反向代理不能简单地终止 TLS 并转发内部应用程序数据,而必须实际实现 PostgreSQL 使用的协议的一些基础知识 - 而 nginx 不提供这一点。

有关详细信息,请参阅PostgreSQL 的 NGINX TLS 终止

相关内容