PostgreSQL启用强制SSL认证后仍可无证书远程连接的问题排查
PostgreSQL强制远程用户SSL认证但无需证书即可连接的问题
我尝试在PostgreSQL中对所有远程用户强制SSL认证,但目前仍无需提供证书即可连接。我的预期是启用强制SSL后,所有远程用户必须提供证书才能连接服务器。
当前配置
pg_hba.conf 配置
# TYPE DATABASE USER ADDRESS METHOD local all all trust host all all 127.0.0.1/32 scram-sha-256 host all all ::1/128 scram-sha-256 hostssl all all 0.0.0.0/0 scram-sha-256 hostssl all all ::/0 scram-sha-256
postgresql.conf 配置
ssl = on ssl_cert_file = '/var/lib/postgresql/14/main/server.crt' ssl_key_file = '/var/lib/postgresql/14/main/server.key' # ssl_ca_file = '' # 该配置未启用
测试情况
我通过以下命令仍能成功连接:
psql -h hostname -p 5432 -U postgres -d postgres --password
问题原因及解决方法
当前配置仅强制远程连接使用SSL加密传输,但并未要求客户端提供证书进行身份验证。要实现强制客户端证书认证,需调整以下配置:
- 修改 pg_hba.conf
将远程连接的认证方式从scram-sha-256改为cert,并添加clientcert=1参数强制要求客户端提供证书:
hostssl all all 0.0.0.0/0 cert clientcert=1 hostssl all all ::/0 cert clientcert=1
- 配置 postgresql.conf
启用ssl_ca_file,指定用于验证客户端证书的CA根证书路径(需提前将CA公钥文件放置对应路径):
ssl_ca_file = '/var/lib/postgresql/14/main/root.crt'
- 重启PostgreSQL服务
修改配置后需重启服务使更改生效:
sudo systemctl restart postgresql
- 客户端连接要求
客户端必须携带对应证书文件才能连接,示例命令:
psql -h hostname -p 5432 -U postgres -d postgres \ --sslmode=verify-full \ --sslrootcert=/path/to/root.crt \ --sslcert=/path/to/client.crt \ --sslkey=/path/to/client.key
内容的提问来源于stack exchange,提问作者Faheem Sultan
相关产品推荐
相关产品推荐

