我想要实现的是
[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 终止