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

时间:2015-08-13 23:47:26

标签: postgresql ssl jdbc x509certificate client-certificates

背景故事:

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

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

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

问题:

我能弄清楚的是如何告诉postgres jdbc driver使用CN为pg-user.XYZ.foo.com从密钥库中获取证书,但是以用户pg的形式呈现给postgres -用户。它似乎是user控制两者的单个参数。有谁知道怎么做?

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

1 个答案:

答案 0 :(得分:2)

感谢@ 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中的正则表达式更改为不匹配,然后我无法再登录,我将其更改回来,我可以。