Jos*_*ker 3 java postgresql vpn psycopg2
我有一个Java应用程序需要通过VPN连接到远程PostgreSQL数据库.这是相关代码:
Class.forName("org.postgresql.Driver");
Connection con = null;
con = DriverManager.getConnection("jdbc:postgresql://" + sqlHost + ":" + sqlPort + "/mydb", username, password);
Run Code Online (Sandbox Code Playgroud)
这会引发错误
org.postgresql.util.PSQLException: FATAL: pg_hba.conf rejects connection for host "172.16.7.5", user "xxxxx", database "xxxxx", SSL off
Run Code Online (Sandbox Code Playgroud)
sqlHost实际上是主机IP地址192.168.12.55,但是如果您注意到错误消息表明它正在连接到主机172.16.7.5(这是VPN分配的IP地址).
我可以使用PGAdmin 和 Python的psocopg2模块在完全相同的VPN上使用完全相同的连接参数连接到此PostgreSQL数据库.这是等效的Python代码:
conn = psycopg2.connect("dbname=mydb user="+username+" password="+password+" host="+sqlHost+" port="+sqlPort)
Run Code Online (Sandbox Code Playgroud)
为什么世界上只有 Java有问题呢?由于连接适用于PGAdmin和Python,我假设Java中有一些设置我使用不正确,但我找不到任何东西.
编辑:在阅读PostgreSQL文档之后,我发现列出错误主机名的问题不是问题的一部分,而是PostgreSQL通过VPN看到我的计算机的方式.然而,问题仍然没有解决.
好的,我自己解决了这个问题.这个问题与VPN无关,而是默认情况下Java默认不尝试任何类型的SSL连接,而PGAdmin和psycopg2do.
解决方案是将以下参数添加到我的连接URL:
ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory