我想要实现的是这个
[Postgresql数据库] -- 透明TCP -- [云端客户端]
【Postgresql数据库】--透明TCP--【跳转服务器上的nginx】--SSL TCP--【云外客户端】
我想通过 nginx 反向代理在带有 SSL 参数的流上添加额外的 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 加密的并回复了一个错误信息?
您不能这样做,因为 PostgreSQL 中的 TLS 不是围绕非 TLS 连接的简单包装器,就像 HTTPS 是基于 TLS 的 HTTP 一样。相反,它从一些简单的通信开始,然后升级到 TLS。因此,反向代理不能简单地终止 TLS 并转发内部应用程序数据,而是必须实际实现 PostgreSQL 使用的协议的一些基础知识——而 nginx 不提供这一点。
有关更多详细信息,请参阅PostgreSQL 的 NGINX TLS 终止