我有一个Java应用程序需要通过VPN连接到远程PostgreSQL数据库。以下是相关代码:
Class.forName("org.postgresql.Driver");
Connection con = null;
con = DriverManager.getConnection("jdbc:postgresql://" + sqlHost + ":" + sqlPort + "/mydb", username, password);
这会引发错误
org.postgresql.util.PSQLException: FATAL: pg_hba.conf rejects connection for host "172.16.7.5", user "xxxxx", database "xxxxx", SSL off
sqlHost
中的主机IP地址实际上是192.168.12.55
,但是如果您发现错误消息表明它正在连接到主机172.16.7.5
(这是VPN分配的IP地址) )。
我可以使用Python的psocopg2
模块使用PGAdmin 和在完全相同的VPN上使用完全相同的连接参数连接到此PostgreSQL数据库。这是等效的Python代码:
conn = psycopg2.connect("dbname=mydb user="+username+" password="+password+" host="+sqlHost+" port="+sqlPort)
为什么世界上只 Java有这个问题?由于连接适用于PGAdmin和Python,我假设Java中有一些设置我使用不正确,但我找不到任何东西。
编辑:在阅读PostgreSQL文档之后,我发现列出错误主机名的问题不是问题的一部分,而是PostgreSQL通过VPN看到我的计算机的方式。然而,问题仍未解决。答案 0 :(得分:5)
好的,我自己解决了这个问题。这个问题与VPN无关,而是默认情况下Java默认不尝试任何类型的SSL连接而PGAdmin和psycopg2
会这样做。
解决方案是将以下参数添加到我的连接URL:
ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory
答案 1 :(得分:2)
我不确定这可能是问题,但我在过去尝试连接到启用了VPN的数据库时遇到了类似的问题。
尝试使用在应用程序启动时传递的此JVM参数运行应用程序:
-Djava.net.preferIPv4Stack=true
另请参阅此answer以获得更持久的解决方案。