我正在尝试使用Spring JDBC模板连接到位于远程位置的PostgreSQL数据库。我正在
org.postgresql.util.PSQLException:致命:主机“139.126.243.71”没有pg_hba.conf条目,用户“guest”,数据库“masterdb”,SSL关闭错误
我无法访问远程位置的pg_hba.conf文件。
这是我在spring servlet.xml中提供的配置
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.postgresql.Driver"/>
<property name="url" value="jdbc:postgresql://100.64.35.52":5432/masterdb"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
我们可以通过提供任何属性来解决问题吗?
答案 0 :(得分:44)
似乎DB服务器不允许SSL关闭连接,您必须启用它。将网址从jdbc:postgresql://100.64.35.52":5432/masterdb
更改为jdbc:postgresql://100.64.35.52":5432/masterdb?sslmode=require
答案 1 :(得分:21)
您必须将以下更改应用于连接:
导航至以下位置C:\Program Files (maybe x86)\PostgreSQL\(your version)\data
postgresql.conf
档案:
检查listen_addresses
be = *
(默认情况下,某些postgres版本中的localhost)如果不是,则必须将其更改为*
。它用于监听所有接口。
pg_hba.conf
档案:
添加新行:
host all all 0.0.0.0/0 md5
(使用上面的行更好) 或
host guest masterdb 139.126.243.71 md5
最后,ssl模式的开启非常重要。为此,在您的网址末尾添加以下命令:
?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory
以豆为术语
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.postgresql.Driver"/>
<property name="url" value="jdbc:postgresql://100.64.35.52":5432/masterdb?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</bean>
答案 2 :(得分:2)
合并设置
我尝试了@ craig-ringer提供的建议
jdbc:postgresql://100.64.35.52":5432/masterdb?ssl=true
由@amit提供
jdbc:postgresql://100.64.35.52":5432/masterdb?sslmode=require
既没有奏效。但是当我把它们结合起来时:
jdbc:postgresql://100.64.35.52":5432/masterdb?ssl=true&sslmode=require
有效。
答案 3 :(得分:1)
错误说明
文件pg_hba.conf
(基于主机的身份验证配置文件)用于控制客户端身份验证。该文件位于数据库集群的数据目录中。
错误java.sql.SQLException: FATAL: no pg_hba.conf entry for host "<your-host-ip>", user "<postgres-user>", database "<db-name>", SSL off
表示Postgres接受SSL连接,但是您正在尝试不使用SSL进行连接。
安全连接
如果在SSL连接启动期间从客户端请求证书,则意味着DBA已在clientcert
中设置了pg_hba.conf
参数。请注意,如果未指定clientcert
(或将其设置为0),服务器将不会坚持要求提供客户端证书。
检查数据库服务器是否使用SSL
在尝试从Java访问启用SSL的服务器之前,请确保您可以通过psql
来访问它。
如果要在给定端口上与给定用户连接:
$ psql -h <server-ip> -p <server-port> -d <db-name> -U <user>
或者如果您想在默认端口上与当前用户连接:
$ psql -h <server-ip>
如果建立了SSL连接,您应该会看到这样的输出:
$ psql -h <server-ip> -d <db-name> -U <user>
psql (11.2, Server 9.6.5)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
请注意,最后一行包含“ SSL连接”。
JDBC连接参数
ssl
。请注意,ssl=true
或ssl
都可以使用,但建议ssl=true
用于Postgres的将来发行版。sslfactory
提供了在建立SSL连接时用作SSLSocketFactory的类名。JDBC驱动程序提供了一个无需进行任何验证即可建立SSL连接的选项(但这很冒险!)。
通过驱动程序随附的自定义SSLSocketFactory
类建立了非验证连接。设置连接URL参数sslfactory=org.postgresql.ssl.NonValidatingFactory
将关闭所有SSL验证。
这是我的情况,为什么我也遇到与您相同的错误。因此,要建立连接,我有:
jdbc:postgresql://<ip-address>:<port>/<db-name>?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory
参考
答案 4 :(得分:0)
请参阅我的回答here,基本上必须将user / pwd放入url属性
url="jdbc:postgresql://server:port/mydb?user=fred&password=secret"
答案 5 :(得分:0)
您必须具有root访问权限编辑pg_hba.conf
。
/var/lib/pgsql/12/data/pg_hba.conf
托管所有139.126.243.71/32信任
service postgresql-12.service restart
]。