You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用OpenSSL为PostgreSQL数据库的多个用户创建客户端证书

PostgreSQL 13 多用户客户端证书实现方案

首先明确规则:PostgreSQL 默认仅读取客户端证书 Subject 字段的单个 CN 值作为登录用户名校验依据,直接填写CN=user1,user2,user3的格式无法被识别,客户端证书场景下也不支持通配符 CN 匹配。

你可以通过以下两种方式实现需求:

方案1:单证书支持多用户登录(推荐)

利用x509v3的subjectAltName(SAN)扩展字段存储多个用户名,配合PG身份映射规则实现单证书多用户可用:

  • 生成带SAN扩展的证书签名请求(CSR),命令如下:
openssl req -new -nodes -out client.csr \
  -keyout keys/client.key -subj "/CN=placeholder" \
  -addext "subjectAltName = DNS:user1, DNS:user2, DNS:user3"
  • 修改pg_hba.conf中cert认证规则,新增映射参数:

hostssl all all 0.0.0.0/0 cert map=multi_user_cert

  • 修改pg_ident.conf新增身份映射规则,匹配SAN中的所有用户名:

multi_user_cert /^(user1|user2|user3)$ \1

  • 执行pg_ctl reload重载PG配置后,该证书即可用于三个用户的身份认证。

方案2:批量生成单用户独立证书

如果需要每个用户持有独立证书,直接用shell循环批量生成即可:

# 替换为实际需要生成证书的用户名列表
for db_user in user1 user2 user3
do
  openssl req -new -nodes -out ${db_user}_client.csr \
    -keyout keys/${db_user}_client.key -subj "/CN=${db_user}"
  # 后续追加你的CA签发证书逻辑即可
done

注意事项

  • 如果你使用私有CA签发证书,需要在CA的openssl配置文件中添加copy_extensions = copy配置,否则签发后的证书会丢失SAN扩展字段。
  • 如果用户名包含不符合DNS命名规则的特殊字符,可以将SAN的类型改为URI格式,同步调整pg_ident.conf的匹配规则即可兼容。

内容的提问来源于stack exchange,提问作者postgresnewbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 17:36:08