如何使用 OpenSSL 为 Postgresql DB 的多个用户创建客户端证书?

Posted

技术标签:

【中文标题】如何使用 OpenSSL 为 Postgresql DB 的多个用户创建客户端证书?【英文标题】:How to create client certificate for multiple users for Postgresql DB with OpenSSL? 【发布时间】:2021-09-12 16:15:09 【问题描述】:

在我的数据库环境(Oracle Linux 8 上的 Postgresql 13)中,我可以为特定的 postgresql db 用户创建客户端证书,如下所示:

openssl req -new -nodes -out client.csr \
  -keyout keys/client.key -subj "/CN=db_username"

虽然它适用于一个用户名,但我想知道是否可以使用多个用户名或通配符。例如,它可以像这样使用吗:

CN=user1,user2,user3 

或类似的东西?

【问题讨论】:

【参考方案1】:

不,但正如the documentation 所述,您可以在pg_ident.conf 文件中使用地图:

用户名映射可用于允许cn与数据库用户名不同。

因此您可以为多个数据库用户使用一个证书(具有一个名称)。

例如,pg_hba.conf 中的行可能看起来像

# TYPE  DATABASE  USER   ADDRESS         METHOD
host    mydb      user1  12.34.56.78/32  cert map=mymap
host    mydb      user2  12.34.56.78/32  cert map=mymap
host    mydb      user3  12.34.56.78/32  cert map=mymap

那么pg_ident.conf 可能看起来像

# MAPNAME  SYSTEM-USERNAME   PG-USERNAME
mymap      certuser          user1
mymap      certuser          user2
mymap      certuser          user3

这里,certuser 是证书中的通用名称。

【讨论】:

是否可以使用带密码的 pg_ident.conf 映射?看来我们不能对这个映射使用 md5 或 scram 密码类型...... 我已经添加了样本。【参考方案2】:

经过多次尝试,我发现如果我像这样配置 pg_hba.conf,我的连接并不关心客户端证书上的 CN:

hostssl    all    all    192.168.1.34/32    scram-sha-256     clientcert=1

这样,只要所需的密钥和证书可用,就可以建立连接。此外,还需要密码以确保连接安全。

【讨论】:

以上是关于如何使用 OpenSSL 为 Postgresql DB 的多个用户创建客户端证书?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OpenSSL 中将 jks 文件转换为 p12 文件?

如何将此终端语法转换为 OpenSSL 的 PHP 语法 [重复]

如何在mamp中开启openssl扩展

OpenSSL 生成 RSA 公钥时,默认指数为 65535,如何更改?

如何在 Windows 中使用 MinGW 构建 OpenSSL? [关闭]

如何使用 OpenSSL 生成带有 SubjectAltName 的自签名证书? [关闭]