如何在PostgreSQL数据库的新端口上配置并启用SSL
在PostgreSQL新端口上启用SSL的具体方案
方案一:单实例监听多个端口(共享同一数据目录)
适合让同一个PostgreSQL实例同时监听默认端口和新端口,且两个端口均强制SSL连接。
修改postgresql.conf配置文件
- 确认全局SSL开关已开启(你已在5432端口启用,此步骤大概率已完成,可再次核对):
ssl = on - 配置多端口监听,将
port参数改为逗号分隔的端口列表,例如新增5433端口:port = 5432, 5433 - 确认SSL证书路径配置正确(替换为你的实际证书/密钥路径):
ssl_cert_file = '/var/lib/postgresql/14/main/server.crt' ssl_key_file = '/var/lib/postgresql/14/main/server.key' ssl_ca_file = '/var/lib/postgresql/14/main/root.crt' # 可选,如需客户端证书验证 - 重启PostgreSQL服务生效:
sudo systemctl restart postgresql
- 确认全局SSL开关已开启(你已在5432端口启用,此步骤大概率已完成,可再次核对):
配置pg_hba.conf强制新端口使用SSL
若需新端口仅接受SSL连接,在pg_hba.conf中添加对应规则(注意规则顺序,确保该规则在非SSL的host规则之前):# 允许所有IP通过5433端口SSL连接所有数据库 hostssl all all 0.0.0.0/0 scram-sha-256 # 如需客户端证书验证,添加clientcert=1参数 hostssl all all 0.0.0.0/0 scram-sha-256 clientcert=1修改后执行重载配置或重启服务:
sudo -u postgres psql -c "SELECT pg_reload_conf();"
方案二:启动独立PostgreSQL实例(新端口+独立配置)
适合新端口对应独立的实例(如不同数据目录、配置参数)。
创建新数据目录与配置文件
- 创建新数据目录(以PostgreSQL 14为例):
sudo mkdir -p /var/lib/postgresql/14/new_port sudo chown postgres:postgres /var/lib/postgresql/14/new_port - 复制并修改原配置文件:
sudo cp /etc/postgresql/14/main/postgresql.conf /var/lib/postgresql/14/new_port/ sudo cp /etc/postgresql/14/main/pg_hba.conf /var/lib/postgresql/14/new_port/ sudo chown postgres:postgres /var/lib/postgresql/14/new_port/*.conf
- 创建新数据目录(以PostgreSQL 14为例):
调整新实例的配置
- 编辑新的postgresql.conf:
port = 5433 # 设置新端口 data_directory = '/var/lib/postgresql/14/new_port' # 指定新数据目录 ssl = on ssl_cert_file = '/var/lib/postgresql/14/main/server.crt' # 可复用原证书或使用新证书 ssl_key_file = '/var/lib/postgresql/14/main/server.key' # 按需调整其他参数,如listen_addresses、max_connections等 - 编辑新的pg_hba.conf,参考方案一添加SSL连接规则。
- 编辑新的postgresql.conf:
初始化并启动新实例
- 切换到postgres用户初始化实例:
sudo -u postgres initdb -D /var/lib/postgresql/14/new_port - 启动新实例:
sudo -u postgres pg_ctl -D /var/lib/postgresql/14/new_port start - 可选:设置开机自启,创建systemd服务文件
/etc/systemd/system/postgresql@14-new_port.service:[Unit] Description=PostgreSQL 14 database server (new port instance) Documentation=man:postgres(1) After=network.target [Service] Type=notify User=postgres ExecStart=/usr/lib/postgresql/14/bin/postgres -D /var/lib/postgresql/14/new_port ExecReload=/bin/kill -HUP $MAINPID KillMode=mixed KillSignal=SIGINT TimeoutSec=0 [Install] WantedBy=multi-user.target - 启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable postgresql@14-new_port sudo systemctl start postgresql@14-new_port
- 切换到postgres用户初始化实例:
验证新端口SSL连接
使用psql测试连接:
psql "host=localhost port=5433 dbname=postgres user=your_user sslmode=require"
连接成功后,执行以下SQL确认SSL状态:
SELECT ssl FROM pg_stat_activity WHERE pid = pg_backend_pid();
返回t则表示当前连接已使用SSL。
内容的提问来源于stack exchange,提问作者sujay777
相关产品推荐
相关产品推荐

