如何使用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
相关产品推荐
相关产品推荐

