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

postgres jdbc client cert user vs db user

背景故事:

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

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

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

问题:

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

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

感谢@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里的正则表达式改成不匹配,然后我就不能登录了,我改回来就可以了。