Skip to content

GaussDB SSL/TLS 配置

证书准备

证书类型

  1. 自签名证书:适用于测试环境或内部使用
  2. CA签名证书:适用于生产环境,由受信任的证书颁发机构签发

生成自签名证书

1. 生成私钥

bash
# 生成2048位RSA私钥
openssl genrsa -out server.key 2048

# 设置私钥权限
chmod 600 server.key

2. 生成证书签名请求(CSR)

bash
openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Example/OU=IT/CN=db.example.com"

3. 生成自签名证书

bash
# 生成有效期为365天的自签名证书
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

4. 生成根证书(可选)

bash
# 生成根CA私钥
openssl genrsa -out root.key 2048

# 生成根CA证书
openssl req -new -x509 -days 3650 -key root.key -out root.crt -subj "/C=CN/ST=Beijing/L=Beijing/O=Example/OU=CA/CN=Example Root CA"

生成CA签名证书

1. 生成私钥和CSR

按照上述步骤生成私钥和CSR

2. 提交CSR到CA

将生成的CSR文件提交给受信任的CA,如Let's Encrypt、DigiCert等

3. 获取CA签名的证书

从CA获取签名后的证书文件,通常包括:

  • 服务器证书(server.crt)
  • CA根证书(ca.crt)
  • 中间证书(可选,ca-chain.crt)

配置GaussDB启用SSL/TLS

配置文件设置

1. 编辑postgresql.conf文件

bash
# 启用SSL
essl = on

# 配置证书文件路径
ssl_cert_file = '/data/gaussdb/server.crt'
ssl_key_file = '/data/gaussdb/server.key'
ssl_ca_file = '/data/gaussdb/root.crt'  # 可选,用于验证客户端证书

# 配置允许的SSL协议版本
ssl_min_protocol_version = 'TLSv1.2'
ssl_max_protocol_version = 'TLSv1.3'

# 配置密码套件
ssl_ciphers = 'HIGH:!aNULL:!MD5:!3DES'

# 配置SSL会话缓存
ssl_session_cache = 'shared:SSL:10m'
ssl_session_timeout = '5m'

2. 编辑pg_hba.conf文件

bash
# 要求所有连接使用SSL
hostssl all all 0.0.0.0/0 md5

# 要求客户端提供证书
hostssl all all 0.0.0.0/0 cert clientcert=1

证书权限设置

bash
# 将证书文件复制到数据库目录
cp server.crt server.key root.crt /data/gaussdb/

# 设置证书文件权限
chown gaussdb:gaussdb /data/gaussdb/*.crt /data/gaussdb/*.key
chmod 600 /data/gaussdb/server.key
chmod 644 /data/gaussdb/server.crt /data/gaussdb/root.crt

重启数据库服务

bash
# 重启GaussDB服务使SSL配置生效
gs_ctl restart -D /data/gaussdb

验证SSL/TLS配置

检查数据库日志

bash
# 查看数据库日志,确认SSL已启用
grep -i ssl /data/gaussdb/log/postgresql.log

使用gsql验证SSL连接

bash
# 使用SSL连接数据库
gsql "sslmode=require host=db.example.com dbname=postgres user=gaussdb"

# 验证连接是否使用SSL
gsql -c "show ssl;" postgres

# 查看SSL连接详细信息
gsql -c "\conninfo" postgres

使用openssl验证

bash
# 使用openssl验证SSL配置
openssl s_client -connect db.example.com:5432 -tls1_2

客户端SSL配置

JDBC客户端配置

java
// JDBC连接字符串示例
String url = "jdbc:postgresql://db.example.com:5432/postgres?ssl=true&sslmode=require&sslrootcert=/path/to/root.crt";

// 设置SSL属性
Properties props = new Properties();
props.setProperty("user", "gaussdb");
props.setProperty("password", "password");
props.setProperty("ssl", "true");
props.setProperty("sslmode", "require");
props.setProperty("sslrootcert", "/path/to/root.crt");

Connection conn = DriverManager.getConnection(url, props);

Python客户端配置

python
import psycopg2

# 连接参数
conn_params = {
    'host': 'db.example.com',
    'port': 5432,
    'database': 'postgres',
    'user': 'gaussdb',
    'password': 'password',
    'sslmode': 'require',
    'sslrootcert': '/path/to/root.crt'
}

# 建立SSL连接
conn = psycopg2.connect(**conn_params)

ODBC客户端配置

ini
[GaussDB SSL]
Driver=PostgreSQL Unicode
Servername=db.example.com
Port=5432
Database=postgres
Uid=gaussdb
Pwd=password
Sslmode=require
Sslrootcert=/path/to/root.crt

SSL/TLS 最佳实践

证书管理

  1. 定期更新证书:证书到期前30天更新
  2. 安全存储私钥:使用硬件安全模块(HSM)存储私钥
  3. 限制证书权限:仅允许数据库用户访问证书文件
  4. 使用强密码算法:使用2048位或更长的RSA密钥

配置优化

  1. 使用推荐的SSL协议版本:TLS 1.2或TLS 1.3
  2. 配置强密码套件:避免使用弱密码算法
  3. 启用SSL会话缓存:提高SSL连接性能
  4. 配置客户端证书验证:对于敏感数据,建议验证客户端身份

监控和审计

  1. 监控SSL连接

    sql
    SELECT * FROM pg_stat_ssl;
  2. 审计SSL连接:在日志中记录SSL连接信息

  3. 定期检查SSL配置:使用SSL扫描工具检查配置安全性

性能优化

  1. 使用硬件加速:如果服务器支持,启用SSL硬件加速
  2. 优化SSL缓冲区
    bash
    ssl_buffer_size = 8192
  3. 调整SSL会话参数
    bash
    ssl_session_cache = 'shared:SSL:10m'
    ssl_session_timeout = '5m'

SSL/TLS 故障排查

常见问题及解决方法

1. 无法启动数据库,提示私钥权限错误

问题:数据库启动失败,日志中显示"permission denied for key file" 解决方法

bash
# 检查私钥权限
chmod 600 /data/gaussdb/server.key
chown gaussdb:gaussdb /data/gaussdb/server.key

2. 客户端连接失败,提示证书验证错误

问题:客户端无法连接,提示"certificate verify failed" 解决方法

  • 确保客户端信任服务器证书的CA
  • 检查证书的CN是否与服务器主机名匹配
  • 确保证书未过期

3. 性能下降

问题:启用SSL后,数据库性能下降 解决方法

  • 启用SSL会话缓存
  • 使用硬件加速
  • 优化SSL缓冲区大小
  • 考虑使用更高效的密码套件

4. 无法使用TLS 1.3

问题:客户端无法使用TLS 1.3连接 解决方法

  • 检查GaussDB版本是否支持TLS 1.3
  • 确保OpenSSL版本支持TLS 1.3
  • 配置ssl_max_protocol_version = 'TLSv1.3'

客户端证书认证

启用客户端证书认证

1. 配置postgresql.conf

bash
# 启用SSL
ssl = on

# 配置CA证书,用于验证客户端证书
ssl_ca_file = '/data/gaussdb/root.crt'

2. 配置pg_hba.conf

bash
# 要求客户端提供有效的SSL证书
hostssl all all 0.0.0.0/0 cert clientcert=1

3. 生成客户端证书

bash
# 生成客户端私钥
openssl genrsa -out client.key 2048

# 生成客户端CSR
openssl req -new -key client.key -out client.csr -subj "/C=CN/ST=Beijing/L=Beijing/O=Example/OU=Client/CN=client1"

# 使用根CA签名客户端证书
openssl x509 -req -days 365 -in client.csr -CA root.crt -CAkey root.key -CAcreateserial -out client.crt

4. 客户端使用证书连接

bash
# 使用客户端证书连接
gsql "sslmode=verify-full host=db.example.com dbname=postgres user=gaussdb sslrootcert=root.crt sslcert=client.crt sslkey=client.key"

常见问题(FAQ)

Q1: 如何检查GaussDB是否已启用SSL?

A1: 检查方法:

  1. 查看postgresql.conf文件中的ssl配置
  2. 检查数据库日志,是否有"SSL is enabled"的消息
  3. 使用gsql连接后执行"show ssl;"命令
  4. 使用"\conninfo"命令查看连接信息

Q2: 自签名证书和CA签名证书有什么区别?

A2: 主要区别:

  • 自签名证书:由自己签发,成本低,但不受浏览器和操作系统信任
  • CA签名证书:由受信任的第三方机构签发,成本较高,但被广泛信任
  • 自签名证书适用于测试环境,CA签名证书适用于生产环境

Q3: 如何更新到期的SSL证书?

A3: 更新步骤:

  1. 生成新的私钥和证书
  2. 将新证书复制到数据库服务器
  3. 重启数据库服务
  4. 更新客户端的CA证书(如果需要)

Q4: 启用SSL会影响数据库性能吗?

A4: 影响程度:

  • SSL加密和解密会增加CPU开销
  • 通常会导致性能下降5-15%
  • 可以通过硬件加速和优化配置来减少性能影响

Q5: 如何配置强制使用SSL连接?

A5: 配置方法:

  1. 在pg_hba.conf中只允许ssl连接
  2. 配置:
    bash
    hostssl all all 0.0.0.0/0 md5
    # 移除所有host行,只保留hostssl行

Q6: 如何验证SSL证书的有效性?

A6: 验证方法:

  1. 检查证书是否过期
  2. 检查证书的CN是否与服务器主机名匹配
  3. 检查证书链是否完整
  4. 使用openssl命令验证:
    bash
    openssl verify -CAfile root.crt server.crt

Q7: 如何配置不同的SSL模式?

A7: SSL模式选项:

  • disable:不使用SSL
  • allow:优先使用SSL,如果不可用则使用非SSL
  • prefer:优先使用SSL,如果不可用则使用非SSL
  • require:必须使用SSL,但不验证证书
  • verify-ca:必须使用SSL,并验证CA证书
  • verify-full:必须使用SSL,并验证CA证书和主机名

Q8: 如何在应用中配置SSL连接?

A8: 配置方法:

  • 根据应用使用的数据库驱动,配置相应的SSL参数
  • 通常需要设置sslmode、sslrootcert等参数
  • 参考驱动文档获取详细配置信息

Q9: 如何监控SSL连接数?

A9: 监控方法:

  1. 使用pg_stat_ssl视图:

    sql
    SELECT count(*) FROM pg_stat_ssl WHERE ssl IS true;
  2. 使用pg_stat_activity视图:

    sql
    SELECT count(*) FROM pg_stat_activity WHERE ssl IS true;

Q10: 如何确保SSL配置的安全性?

A10: 安全建议:

  1. 使用TLS 1.2或更高版本
  2. 配置强密码套件
  3. 定期更新证书
  4. 限制证书权限
  5. 启用客户端证书验证(对于敏感数据)
  6. 定期使用SSL扫描工具检查配置