我们有一个远程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
对此有任何见解表示赞赏!谢谢。
你的pg_hba.conf设置是什么样的?
JDBC驱动程序仅支持trust,ident,password,md5和crypt身份验证方法。
因此,您的Java应用程序必须使用密码和证书进行连接。您可以在pb_hba.conf中指定:
hostssl all all 0.0.0.0/0 md5 clientcert=1