【问题标题】:org.postgresql.util.PSQLException: FATAL: no pg_hba.conf entry for hostorg.postgresql.util.PSQLException:致命:主机没有 pg_hba.conf 条目
【发布时间】:2014-10-27 18:15:48
【问题描述】:

我正在尝试使用 Spring JDBC 模板连接到位于远程位置的 PostgreSQL 数据库。我得到了

org.postgresql.util.PSQLException: FATAL: no pg_hba.conf entry for host "139.126.243.71", user "guest", database "masterdb", SSL off error

我无权访问远程位置的 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>

我们可以通过给出任何属性来解决这个问题吗?

【问题讨论】:

  • 猜测可能需要 SSL。尝试将?ssl=true 添加到 JDBC URI。
  • 我尝试将 ?ssl=true 添加到 JDBC URI,但它仍然显示相同的错误。 org.postgresql.util.PSQLException: FATAL: no pg_hba.conf entry for host "139.126.243.71", user "guest", database "masterdb", SSL on
  • 如果 pg_hba.conf 阻止从您的 IP 连接到该数据库,那么除了要求管理员更改 pg_hba.conf 之外,您无能为力。您是否尝试使用简单的 psql 程序连接?跨度>
  • 遇到同样问题的mac怎么样

标签: postgresql


【解决方案1】:

似乎数据库服务器不允许 SSL 断开连接,您必须启用它。将网址从jdbc:postgresql://100.64.35.52":5432/masterdb 更改为jdbc:postgresql://100.64.35.52":5432/masterdb?sslmode=require

http://www.postgresql.org/docs/9.1/static/libpq-ssl.html查看有关ssl模式的详细信息

【讨论】:

  • 修复了它以连接到 heroku postgres 实例。
  • 像@Amit 的魅力一样工作!已修复连接到 heroku postgres!
  • 修复了我在尝试使用 SQuirreL 客户端连接到供应商远程框时的连接问题,并且我无法更改他们的数据库服务器配置。感谢您的帖子,即使它已经快 1 岁了。感谢帮助!
  • 这里相同,已修复 heroku postgres 连接。
  • 解决了我与 AWS RDB 的连接问题。谢谢!
【解决方案2】:

您必须应用以下更改才能连接:

导航到以下位置C:\Program Files (maybe x86)\PostgreSQL\(your version)\data

postgresql.conf 文件:

检查listen_addresses 是否=*(在某些postgres 版本中默认为本地主机),如果不是,则必须将其更改为*。用于监听所有接口。

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 方面

<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>

【讨论】:

  • 我根本没有更改 pg_hba.conf 文件。只需添加 ?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory 对我有用。
  • 刚刚更改了 pg_hba.conf 并重新启动了 postgresql。它对我有用。
  • 这应该是公认的答案。对我来说就像一个魅力! ^_^
  • 嘿,我应该在哪里添加 SSL 命令。我没有看到我的配置的任何 xml 文件。有什么办法可以在 pg_hba.conf 中编辑它?
【解决方案3】:

错误说明

文件pg_hba.conf(基于主机的身份验证配置文件)用于控制客户端身份验证。该文件位于数据库集群的数据目录中。

错误java.sql.SQLException: FATAL: no pg_hba.conf entry for host "&lt;your-host-ip&gt;", user "&lt;postgres-user&gt;", database "&lt;db-name&gt;", SSL off 表示 Postgres 接受 SSL 连接,但您尝试不使用 SSL 进行连接。

安全连接

如果在 SSL 连接启动过程中向客户端请求证书,则说明 DBA 在pg_hba.conf 中设置了clientcert 参数。请注意,如果未指定 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=truessl 都可以使用,但建议将 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】:

    组合设置

    我尝试了@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
    

    成功了。

    【讨论】:

      【解决方案5】:

      看我的回答here,基本上必须把user/pwd放在url属性中

      url="jdbc:postgresql://server:port/mydb?user=fred&amp;password=secret"
      

      【讨论】:

      • 我遇到了同样的问题,虽然我以另一种方式提供用户名/密码,但他们错了!我猜PostgreSQL认为'用户身份验证不起作用,让我们尝试基于主机的身份验证',然后在抱怨后者不起作用时忘记提及第一个条件。 :-\
      【解决方案6】:

      您必须具有 root 访问权限编辑 pg_hba.conf

      • 转到 root 用户
      • 编辑/var/lib/pgsql/12/data/pg_hba.conf

      托管所有所有 139.126.243.71/32 信任

      1. 重启 Postgres [service postgresql-12.service restart]。

      【讨论】:

        猜你喜欢
        • 2013-10-19
        • 2020-05-19
        • 2014-06-14
        • 1970-01-01
        • 1970-01-01
        • 2010-11-27
        • 2015-10-18
        • 1970-01-01
        相关资源
        最近更新 更多