【问题标题】:Postgresql JDBC SSLPostgresql JDBC SSL
【发布时间】:2019-03-29 07:16:38
【问题描述】:

我们有一个远程 PostgreSQL 数据库服务器,需要提供 SSL 证书才能连接到它。

我有以下证书。

root.pem
intermediate.pem
private-chain.pem
public-chain.pem
certificate.cer
certificate.key

我可以使用 psql as

连接到远程数据库
psql "port=5432 host=remote-host user=username sslcert=public-chain.pem sslkey=certificate.key dbname=database sslmode=require"

现在,我需要从 基于 Java Spring 的 Rest API 连接到同一个数据库。因此,理想情况下,这需要从证书构建击键并使用它连接到数据库。

问题是,我做不到!我已经在密钥库中尝试了证书、公共链、私有链、根 ca 等的所有组合。我尝试在调用 jar 文件时将密钥库作为 JVM 参数传递(-Djavax.net.ssl.trustStore -Djavax.net.ssl.trustStorePassword -Djavax.net.ssl.keyStore -Djavax.net.ssl .keyStorePassword)。

我还尝试从 PostgreSQL JDBC 连接字符串中指向击键(jdbc:postgresql://remote-host:5432/database?ssl=true&sslcert='filename'&sslkey='key')。不确定这是否是正确的方法。

但我不断收到此错误。

Caused by: org.postgresql.util.PSQLException: FATAL: connection requires a valid client certificate
    at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:473) ~[postgresql-42.2.2.jar!/:42.2.2]
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:205) ~[postgresql-42.2.2.jar!/:42.2.2]
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49) ~[postgresql-42.2.2.jar!/:42.2.2]
    at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:195) ~[postgresql-42.2.2.jar!/:42.2.2]
    at org.postgresql.Driver.makeConnection(Driver.java:452) ~[postgresql-42.2.2.jar!/:42.2.2]
    at org.postgresql.Driver.connect(Driver.java:254) ~[postgresql-42.2.2.jar!/:42.2.2]

我无法弄清楚为什么它适用于 psql 而不适用于 jdbc。

编辑 1:

目前我正在尝试以下方法。这是spring数据源配置

spring.datasource.url=jdbc:postgresql://remote-host:5432/database?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory
spring.datasource.username=username

这是证书配置

export PGSSLCERT=/tmp/client.cer 
export PGSSLKEY=/tmp/client.key
export PGSSLMODE=allow

我还按照here 中描述的步骤来信任 root ca。但我想这是没有必要的,因为我使用的是 org.postgresql.ssl.NonValidatingFactory

我正在启动应用程序

java -jar -Dspring.profiles.active=prod application.jar

感谢您对此的任何见解!谢谢。

【问题讨论】:

  • 你能分享你试图运行的代码吗?将有助于理解和帮助。
  • 您为这些系统属性和连接字符串设置了哪些值?
  • 抱歉回复晚了。我已经编辑了问题并添加了详细信息。这就是你要找的东西吗?
  • @abisheksampath 你能更新一下你是如何解决这个问题的吗?我也遇到了类似的问题。

标签: java postgresql ssl jdbc spring-jdbc


【解决方案1】:

您的 pb_hba.conf 设置是什么样的?

JDBC驱动只支持trust、ident、password、md5、crypt认证方式。

因此,您的 Java 应用程序必须使用密码和证书进行连接。您可以在 pb_hba.conf 中指定:

hostssl all all 0.0.0.0/0 md5 clientcert=1

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 2015-02-18
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
相关资源
最近更新 更多