postgres jdbc 客户端证书用户与数据库用户

Posted

技术标签:

【中文标题】postgres jdbc 客户端证书用户与数据库用户【英文标题】:postgres jdbc client cert user vs db user 【发布时间】:2015-08-13 23:47:26 【问题描述】:

背景故事:

我已经让 jdbc 使用客户端证书连接到 postgres。在 java 中,我在属性中设置用户,驱动程序在密钥库中查找并发送它。一切都很好。

但我刚刚发现我不会获得 CN 为 pg-user 的证书。我将获得的证书将具有 pg-user.XYZ.foo.com 和 pg-user.ABC.foo.com 的 CN。这看起来像是username maps 的工作。嘿,他们甚至有正则表达式,这将是完美的。

我让 unix 用户 root 使用用户名映射以 pg-user 身份登录到 postgres,并使用 psql -d db -U pg-user 进行本地身份验证。但在这种情况下,postgres 知道 BOTH 用户是 root,AND 正在尝试以 pg-user 身份登录。

问题:

我想不通的是如何告诉postgres jdbc driver 从具有 pg-user.XYZ.foo.com 的 CN 的密钥库中获取证书,但以用户 pg-user 的身份呈现给 postgres。它似乎是控制两者的user 的单个参数。有谁知道怎么做?

This page 包含一个连接选项列表,但它似乎没有提供拆分用户名的方法。我看到的最接近的是编写自己的 sslfactory 的选项,我真的希望避免这种情况......

【问题讨论】:

您是否尝试过将证书添加到具有实际名称pg-user 的别名的密钥库中?我认为即使使用实际的数据库用户名进行连接,它也可以让您找到正确的证书 我怀疑您将需要一个自定义 SSLSocketFactory。不过,它并不像看起来那么糟糕。否则...只需修补 PgJDBC 为所需的 SSL 客户端证书 CN 添加单独的参数,然后在 github 上提交您的补丁。 【参考方案1】:

感谢@harmic 的评论,我能够解决这个问题。

从以下三个文件开始:

pg-user.pem 的 CN 为 pg-user.XYZ.foo.com pg-user-chain.pem 包含链证书 pg-user.private_key 包含证书的私钥

然后我像这样创建了 pkcs12 文件:

cat pg-user.pem pg-user-chain.pem > cert-and-chain.pem
openssl pkcs12 -export -out ssl_cert.p12 -in cert-and-chain.pem -name pg-user -inkey private_key.pem -passout pass:password here

之后我将连接的用户属性声明为pg-user,并且它起作用了。为了测试,我把 pg_ident 中的正则表达式改成不匹配,然后就不能再登录了,我改回来就可以了。

【讨论】:

以上是关于postgres jdbc 客户端证书用户与数据库用户的主要内容,如果未能解决你的问题,请参考以下文章

只允许通过 sql server、oracle 和 postgres 中的 jdbc 更新表

Docker Compose 无法从数据库 (jdbc:postgresql://db:5432/postgres) 为用户“postgres”获取连接:连接尝试失败

通过 JDBC 连接到 postgres 服务器时 sslmode 参数的默认值?

Postgres JDBC 客户端卡在从套接字读取

Postgres / JDBC 与 pgjdbc-ng:将 EAN 类型写入数据库

Postgres JDBC连接作为应用程序用户而不是系统用户