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 参数的默认值?