Postgresql JDBC SSL

问题描述 投票:1回答:1

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

我有以下证书。

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

我可以使用psql作为连接到远程数据库

psql "port=5432 host=remote-host user=username sslcert=public-chain.pem sslkey=certificate.key dbname=database sslmode=require"

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

问题是,我无法做到!我已经在密钥库中尝试过cert,public-chain,private-chain,root 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

对此有任何见解表示赞赏!谢谢。

java postgresql ssl jdbc spring-jdbc
1个回答
0
投票

你的pg_hba.conf设置是什么样的?

JDBC驱动程序仅支持trust,ident,password,md5和crypt身份验证方法。

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

hostssl all all 0.0.0.0/0 md5 clientcert=1
© www.soinside.com 2019 - 2024. All rights reserved.