java 通过ssl连接flyway和postgres时出现问题

ryhaxcpt  于 2023-04-04  发布在  Java
关注(0)|答案(2)|浏览(199)

bounty已结束,回答此问题可获得+50声望奖励,奖励宽限期13小时后结束,amaurinorato希望引起更多关注此问题。

我有一个Java应用程序,以前运行Postgres JDBC依赖版本42.2.5和flyway版本5.2.1。这些版本来自spring-boot-dependencies项目。在本例中,我们使用2.1.0.RELEASE版本。
所以,我有升级这些依赖项的任务。我这样做了。spring-boot-dependencies现在是2.7.8。Flyway版本现在是7.15.0。我现在保留postgres在旧版本,因为下面描述的错误。
问题是,在升级后,如果我将属性spring.flyway.enabled设置为true,应用程序将无法启动。它一直在抱怨有效的证书:

Caused by: org.flywaydb.core.internal.exception.FlywaySqlException: Unable to obtain connection from database: FATAL: connection requires a valid client certificate
------------------------------------------------------------------------------------------------
SQL State  : 28000
Error Code : 0
Message    : FATAL: connection requires a valid client certificate

        at org.flywaydb.core.internal.jdbc.JdbcUtils.openConnection(JdbcUtils.java:67)
        at org.flywaydb.core.internal.jdbc.JdbcConnectionFactory.<init>(JdbcConnectionFactory.java:70)
        at org.flywaydb.core.Flyway.execute(Flyway.java:504)
        at org.flywaydb.core.Flyway.migrate(Flyway.java:170)
        at org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:66)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)
        ... 38 common frames omitted
Caused by: org.postgresql.util.PSQLException: FATAL: connection requires a valid client certificate
        at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:514)
        at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:141)
        at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:192)
        at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
        at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:195)
        at org.postgresql.Driver.makeConnection(Driver.java:454)
        at org.postgresql.Driver.connect(Driver.java:256)
        at org.springframework.jdbc.datasource.SimpleDriverDataSource.getConnectionFromDriver(SimpleDriverDataSource.java:144)
        at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:205)
        at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:169)
        at org.flywaydb.core.internal.jdbc.JdbcUtils.openConnection(JdbcUtils.java:52)
        ... 44 common frames omitted

如果我禁用flyway,应用程序将启动并可以连接到数据库。
我的属性文件看起来像这样:

spring.datasource.url=jdbc:postgresql://host:5432/db?ssl=true&sslmode=require&sslfactory=org.postgresql.ssl.DefaultJavaSSLFactory
spring.datasource.username=user
spring.datasource.password=

server.ssl.key-store=classpath:certs/keystore-dev.p12
server.ssl.key-store-password=pass
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=app-alias
server.ssl.protocol=TLS
# flyway db migration support
spring.flyway.enabled=true

自应用程序启动并连接到数据库以来,连接数据是正确的。

i5desfxk

i5desfxk1#

好吧,在了解了真实的的问题之后,解决的办法很简单:
由于某种原因,我仍然不知道为什么,当从spring 2.4.2升级到2.4.3及更高版本时,它改变了beans加载的顺序。所以,以前,我们在flyway尝试连接到数据库并应用更改之前加载了负责加载证书的类DatasourceContextConfiguration。升级后,flyway开始尝试首先连接到数据库,所以修复的方法基本上就是找到一种方法来加载这个bean,负责在flyway尝试应用迁移之前加载证书

sdnqo3pr

sdnqo3pr2#

错误消息指示Postgres JDBC驱动程序正在请求有效的客户端证书以建立到数据库的连接。当服务器已配置为需要SSL连接,而客户端未提供有效的SSL证书时,可能会发生此错误。
在您的配置中,您将SSL工厂指定为org.postgresql.ssl.DefaultJavaSSLFactory,这意味着Postgres JDBC驱动程序将使用默认的Java SSL实现来创建SSL套接字工厂。这可能不足以满足您的特定用例。
要解决此问题,您可以尝试以下一个或多个步骤:
1.验证服务器是否已配置为接受来自客户端的SSL连接。您可以检查服务器日志或查阅Postgres文档以获取有关如何配置SSL的说明。
1.验证客户端是否提供了有效的SSL证书。您可以使用keytool命令生成新的SSL证书,并在spring.datasource.ssl.key-store属性中指定密钥库的路径。
1.尝试在配置中使用其他SSL实现。例如,您可以将SSL工厂指定为org.postgresql.ssl.NonValidatingFactory,这将创建一个不执行证书验证的SSL套接字工厂。
要使用NonValidatingFactory,您可以按如下方式更新配置:

spring.datasource.url=jdbc:postgresql://host:5432/db?ssl=true&sslmode=require&sslfactory=org.postgresql.ssl.NonValidatingFactory

相关问题