设置 SSL 加密

最近更新时间:2025-07-18 11:13:32

我的收藏

SSL 加密概述

SSL(Secure Sockets Layer)认证是客户端到云数据库服务器端的认证,对用户和服务器进行认证。开通 SSL 加密,可获取 CA 证书,将 CA 证书上传在服务端。在客户端访问数据库时,将激活 SSL 协议,在客户端和数据库服务端之间建立一条 SSL 安全通道,实现数据信息加密传输,防止数据在传输过程中被截取、篡改、窃听,保证双方传递信息的安全性。
SSL 协议要求建立在可靠的传输层协议(TCP)之上,其优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP、FTP、TELNET 等)能透明地建立于 SSL 协议之上。SSL 协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作,在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。

背景

使用非加密方式连接数据库时,在网络中传输的所有信息都是明文,因此存在被非法用户窃听、篡改、冒充的三大风险;而 SSL 协议是为解决这三大风险而设计的,理论上可达到:
信息是加密传播,第三方无法窃听。
具有校验机制,一旦被篡改,通信双方会立刻发现。
配备身份证书,防止身份被冒充。
云数据库 PostgreSQL 支持通过开启 SSL 加密来增强链路安全性,并支持下载和安装 SSL CA 证书到需要的应用服务。
注意:
SSL 加密不保护数据本身,是确保来往于数据库和服务器之间的流量安全,在传输层对网络连接进行加密,能够提升通信数据的安全性和完整性,但会同时增加网络连接响应时间。

注意事项

实例版本为 PostgreSQL 11及以上版本。
支持 TLS 1.0、TLS 1.1、TLS 1.2、TLS 1.3。
实例克隆出新实例后,新实例默认不开启 SSL 连接加密,需要您手动开启。
如果需要对只读实例开启 SSL 连接加密,则强烈建议对只读组内的所有只读实例开启连接加密。否则,可能会因为保护的连接地址为只读组的 VIP ,导致部分请求失败。
开启 SSL 过程中,会重启您的数据库实例以加载 SSL 证书,请确保业务具备重连机制。

开启 SSL 加密

1. 登录 PostgreSQL 控制台,在实例列表,单击实例 ID操作列的管理,进入实例管理页面。
2. 实例管理页面的数据安全页下,选择 SSL 页签。

3. 此功能状态默认为未打开,将开关调为开启,然后单击确定,开启 SSL 加密。
开启 SSL 窗口如下:

系统支持在开启 SSL 连接加密的时候指定 VIP 或者外网域名作为保护的连接地址。当实例有多个连接地址时,您可以选择其中一个连接地址。每次开启 SSL 连接加密只支持选择一个 VIP 或者外网域名。
单击下载,下载 SSL CA 证书,证书有效期为20年。下载的文件为压缩包(TencentDB-PG-SSL-CA.zip),包含如下三个文件:
p7b 文件:用于 Windows 系统中导入 CA 证书。
jks 文件:Java 中的 truststore 和 keystore 证书存储文件,密码统一为 tencentdb_pg,用于 Java 程序中导入 CA 证书链。
pem 文件:用于其他系统或应用中导入 CA 证书。

使用 SSL 链路连接数据库

psql 终端 SSL 连接

说明:
本步骤依赖本地 PostgreSQL 客户端自带的 psql 命令行工具,请确保您已安装 PostgreSQL 客户端,具体安装及操作请参见 PostgreSQL 官方文档
1. /usr/local/pgsql/文件夹下创建.postgresql文件夹。
mkdir -p /usr/local/pgsql/.postgresql
2. 将下载的服务端证书 ca.pem 拷贝到.postgresql文件夹。
[root@VM-0-6-tencentos .postgresql]# ll
total 4
-rw------- 1 postgres postgres 2681 Feb 6 11:13 ca.pem
3. 修改 .postgresql 文件夹权限。
chown postgres:postgres /usr/local/pgsql/.postgresql/*
chmod 600 /usr/local/pgsql/.postgresql/*
4. 设置 postgres 用户的环境变量。
[root@VM-0-6-tencentos .postgresql]# export PGSSLROOTCERT="/usr/local/pgsql/.postgresql/ca.pem"
[root@VM-0-6-tencentos .postgresql]# echo $PGSSLROOTCERT
/usr/local/pgsql/.postgresql/ca.pem
5. 设置客户端在连接时对数据库的认证方式。
[root@VM-0-6-tencentos .postgresql]# export PGSSLMODE="require"
[root@VM-0-6-tencentos .postgresql]# echo $PGSSLMODE
require
说明:
PGSSLMODE 参数的说明请参考 官方文档
6. 连接数据库。
[root@VM-0-6-tencentos .postgresql]# psql -h10.6.0.1 -p5432 -Udbadmin -dpostgres
Password for user dbadmin:
psql (16.4, server 11.22)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

postgres=>
如上所示,如果输出中包含 SSL connection,则表示当前连接使用了 SSL 加密。

JDBC SSL 连接

说明:
本步骤依赖于您已经安装 JDK 并下载了 JDBC 驱动。
1. /usr/local/pgsql/文件夹下创建.postgresql文件夹。
mkdir -p /usr/local/pgsql/.postgresql
2. 将下载的服务端证书 ca.pem 和ca.jks拷贝到.postgresql文件夹。
[root@VM-0-6-tencentos .postgresql]# ll
total 8
-rw------- 1 postgres postgres 2840 Feb 6 19:55 ca.jks
-rw------- 1 postgres postgres 2681 Feb 6 11:13 ca.pem
3. 修改 .postgresql 文件夹权限。
chown postgres:postgres /usr/local/pgsql/.postgresql/*
chmod 600 /usr/local/pgsql/.postgresql/*
4. 配置业务代码使用 SSL 连接 PostgreSQL,并运行程序。
使用 pem 证书示例配置如下,具体参数基于您业务详情配置。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

public class Main {
public static void main(String[] args) {
try {
Class.forName("org.postgresql.Driver");

Properties props = new Properties();
props.setProperty("user", "xxxxxxx");
props.setProperty("password", "xxxxxxxx");
props.setProperty("ssl", "true");
props.setProperty("sslmode", "require");
props.setProperty("sslrootcert", "/usr/local/pgsql/.postgresql/ca.pem");

Connection conn = DriverManager.getConnection(
"jdbc:postgresql://10.6.0.1:5432/postgres",
props
);

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery("SELECT * FROM mytable");

while (rs.next()) {
System.out.println(rs.getString("id"));
}

conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用 jks 证书示例配置如下,具体参数基于您业务详情配置。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

public class Main1 {
public static void main(String[] args) {
try {
Class.forName("org.postgresql.Driver");

System.setProperty("javax.net.ssl.trustStore", "/usr/local/pgsql/.postgresql/ca.jks");
System.setProperty("javax.net.ssl.trustStorePassword","tencentdb_pg");
System.setProperty("javax.net.ssl.keyStore","/usr/local/pgsql/.postgresql/ca.jks");
System.setProperty("javax.net.ssl.keyStorePassword","tencentdb_pg");
Properties props = new Properties();
props.setProperty("user", "xxxxx");
props.setProperty("password", "xxxxx");
props.setProperty("ssl", "true");
props.setProperty("sslmode", "require");
props.setProperty("sslfactory", "org.postgresql.ssl.DefaultJavaSSLFactory");
Connection conn = DriverManager.getConnection(
"jdbc:postgresql://10.6.0.1:5432/postgres",
props
);

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery("SELECT * FROM mytable");

while (rs.next()) {
System.out.println(rs.getString("id"));
}

conn.close();
} catch (Exception e) {
e.printStackTrace();
}

Go SSL 连接

说明:
本步骤依赖于您已经安装 GO 并完成驱动配置。
1. /usr/local/pgsql/文件夹下创建.postgresql文件夹。
mkdir -p /usr/local/pgsql/.postgresql
2. 将下载的服务端证书 ca.pem 拷贝到.postgresql文件夹。
[root@VM-0-6-tencentos .postgresql]# ll
total 4
-rw------- 1 postgres postgres 2681 Feb 6 11:13 ca.pem
3. 修改 .postgresql 文件夹权限。
chown postgres:postgres /usr/local/pgsql/.postgresql/*
chmod 600 /usr/local/pgsql/.postgresql/*
4. 配置业务代码使用 SSL 连接 PostgreSQL,并运行程序。示例配置如下,具体参数基于您业务详情配置。
package main

import (
"database/sql"
"fmt"
"log"

_ "github.com/lib/pq"
)

func main() {
connStr := "user=dbadmin password=xxxxx dbname=postgres host=10.6.0.1 port=5432 sslmode=require sslrootcert=/usr/local/pgsql/.postgresql/ca.pem"
db, err := sql.Open("postgres", connStr)
if err != nil {
log.Fatal(err)
}

err = db.Ping()
if err != nil {
log.Fatal(err)
}

fmt.Println("Successfully connected!")
}

Node.js SSL 连接

1. /usr/local/pgsql/文件夹下创建.postgresql文件夹。
mkdir -p /usr/local/pgsql/.postgresql
2. 将下载的服务端证书 ca.pem 拷贝到.postgresql文件夹。
[root@VM-0-6-tencentos .postgresql]# ll
total 4
-rw------- 1 postgres postgres 2681 Feb 6 11:13 ca.pem
3. 修改 .postgresql 文件夹权限。
chown postgres:postgres /usr/local/pgsql/.postgresql/*
chmod 600 /usr/local/pgsql/.postgresql/*
4. 配置业务代码使用 SSL 连接 PostgreSQL,并运行程序。示例配置如下,具体参数基于您业务详情配置。
const { Client } = require('pg');
const fs = require('fs');
const tls = require('tls');

// 配置数据库连接参数
const client = new Client({
user: '****',
host: '**.**.**.**',
database: '*****',
password: '*****',
port: 5432, // 默认端口
ssl: {
host: '**.**.**.**',
ca: fs.readFileSync('./ca.pem').toString(), // CA 证书路径
},
});

// 连接到数据库
client.connect()
.then(() => {
console.log('Connected to PostgreSQL');
// 查询 pg_stat_ssl 视图,获取当前连接的详细 SSL 信息。这里的query可以业务自定义
const query = `
SELECT ssl, version, cipher, bits
FROM pg_stat_ssl
WHERE pid = pg_backend_pid();
`;
return client.query(query);
})

.then(res => {
if (res.rows.length > 0) {
const sslInfo = res.rows[0];
console.log('SSL connection:', sslInfo.ssl);
console.log('SSL version:', sslInfo.version);
console.log('SSL cipher:', sslInfo.cipher);
console.log('SSL bits:', sslInfo.bits);
} else {
console.log('No SSL information available for this connection.');
}
return client.end();
})
.catch(err => console.error('Connection error', err.stack));


刷新服务端证书

在如下几种场景如您想变更实例 SSL 连接加密保护的连接 VIP,您可以刷新服务端证书。
实例新增网络
实例新增网络后会新增 VIP,如果此时实例已经开启了 SSL 连接加密且选择的保护地址为原来的 VIP,则客户端使用此新增 VIP 连接实例并开启 SSL 连接加密会报错。此时您需要刷新服务端证书,并重新选择您需要保护的连接 VIP。
实例删除网络
实例删除网络后会有一个 VIP 被删除,如果此时实例已经开启了 SSL 连接加密且选择的保护地址为删除的 VIP,则客户端使用此删除的 VIP 或者实例的其他 VIP 连接实例并开启 SSL 连接加密会报错。此时您需要刷新服务端证书,并重新选择您需要保护的连接 VIP。
实例开启外网
实例开启外网后,会新增外网连接地址,此时如果实例已经开启了 SSL 连接加密且选择的保护地址不是该外网地址,则客户端使用此外网地址连接实例并切开启 SSL 连接加密会报错。此时您需要刷新服务端证书,并重新选择您需要保护的连接地址为该外网地址。
实例关闭外网
实例关闭外网后,外网地址会被回收。此时如果实例已经开启了 SSL 连接加密且选择的保护地址依然是该外网地址,则客户端使用此外网地址连接实例并切开启 SSL 连接加密会报错。此时您需要刷新服务端证书,并重新选择您需要保护的连接 VIP。
只读组内新增只读实例
当只读组内所有的只读实例均已经开启了 SSL 连接加密,此时只读组内新增了只读实例,该只读实例没有开启 SSL 连接加密或者开启了连接加密但是选择的保护地址不是只读组的 VIP,此时客户端使用只读组的 VIP 连接时可能会存在部分请求失败。此时您需要将只读组内所有只读实例均开启 SSL 连接加密。且选择的保护地址为只读组的 VIP。
只读实例变更连接保护地址
只读实例在开启 SSL 连接加密时可以选择的连接地址为只读组的 VIP 或者 只读实例的 VIP ,当您想变更保护地址时,您需要刷新服务端证书。
刷新服务端证书步骤如下:
1. 登录 PostgreSQL 控制台,在实例列表,单击实例 ID操作列的管理,进入实例管理页面。
2. 实例管理页面的数据安全页下,选择 SSL 页签。
3. SSL 页,您能看到当前的证书的保护连接地址。

4. 如果您需要更换保护的连接地址,点击修改即可。


关闭 SSL 加密

说明:
关闭 SSL 过程中,会重启您的数据库实例以卸载 SSL 证书,请确保业务具备重连机制。
1. 登录 PostgreSQL 控制台,在实例列表,单击实例 ID操作列的管理,进入实例管理页面。
2. 实例管理页面的数据安全页下,选择 SSL 页签。
3. 单击已开通前面的开关按钮,在弹出的提示框中单击确定