PostgreSQL作为常用的开源关系型数据库,默认连接方式为明文传输,在公网环境或敏感数据传输场景下存在安全风险,配置SSL加密连接并创建对应的SSL数据源是很有必要的。下面我们就一步步完成相关配置。

一、PostgreSQL服务端SSL配置
1. 生成SSL证书
首先需要生成服务端使用的SSL证书,这里使用OpenSSL工具完成,依次执行以下命令:
# 生成CA私钥 openssl genrsa -out ca.key 2048 # 生成CA证书 openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/CN=PostgreSQL_CA" # 生成服务端私钥 openssl genrsa -out server.key 2048 # 生成服务端证书请求 openssl req -new -key server.key -out server.csr -subj "/CN=postgres-server" # 用CA证书签发服务端证书 openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650 # 设置证书权限,PostgreSQL要求私钥权限不能过高 chmod 0600 server.key ca.key
2. 修改PostgreSQL配置文件
将生成的ca.crt、server.crt、server.key三个文件放到PostgreSQL的数据目录下,然后修改postgresql.conf文件,开启SSL功能:
# 开启SSL ssl = on # 指定服务器证书路径 ssl_cert_file = 'server.crt' # 指定服务器私钥路径 ssl_key_file = 'server.key' # 指定CA证书路径,用于验证客户端证书(可选) ssl_ca_file = 'ca.crt'
接着修改pg_hba.conf文件,添加SSL连接规则,比如允许所有IP通过SSL方式连接:
# 格式:连接类型 数据库 用户 地址 认证方法 选项 hostssl all all 0.0.0.0/0 md5
修改完成后重启PostgreSQL服务使配置生效。
二、验证服务端SSL是否生效
可以使用psql客户端连接数据库,查看SSL状态:
psql "host=127.0.0.1 port=5432 dbname=postgres user=postgres sslmode=require" # 连接成功后执行以下SQL查看SSL状态 postgres=# show ssl; ssl ----- on (1 row)
三、创建SSL数据源
1. Java场景下的SSL数据源配置
Java连接PostgreSQL需要导入CA证书到信任库,然后配置数据源参数,示例代码如下:
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;
import java.util.Properties;
public class PgSslDataSource {
public static DataSource createSslDataSource() {
HikariConfig config = new HikariConfig();
// 数据库地址,指定sslmode为require
config.setJdbcUrl("jdbc:postgresql://127.0.0.1:5432/postgres?sslmode=require");
config.setUsername("postgres");
config.setPassword("your_password");
// 如果需要验证服务器证书,需要配置sslrootcert参数指向CA证书路径
Properties props = new Properties();
props.setProperty("sslrootcert", "/path/to/ca.crt");
config.setDataSourceProperties(props);
return new HikariDataSource(config);
}
}2. Python场景下的SSL数据源配置
使用psycopg2库连接时,配置SSL参数的示例如下:
import psycopg2
from psycopg2.extras import DictCursor
def get_ssl_conn():
conn = psycopg2.connect(
host="127.0.0.1",
port=5432,
dbname="postgres",
user="postgres",
password="your_password",
# sslmode可选require、verify-ca、verify-full等
sslmode="require",
# 如果需要验证CA证书,指定sslrootcert路径
sslrootcert="/path/to/ca.crt"
)
return conn四、常见问题说明
- sslmode参数可选值:disable(不使用SSL)、allow(优先尝试SSL)、prefer(默认,优先SSL)、require(必须使用SSL)、verify-ca(验证CA证书)、verify-full(验证CA和服务器主机名)
- 如果客户端连接时报证书验证失败,检查CA证书路径是否正确,以及证书是否过期
- 生产环境建议使用verify-full模式,避免中间人攻击
按照以上步骤操作,就可以完成PostgreSQL SSL加密连接的配置,以及对应SSL数据源的创建,保障数据传输过程的安全性。
PostgreSQLSSL数据源加密连接SSL证书修改时间:2026-05-30 21:23:04