3

我正在使用 Spring3、Hibernate4 和 postgres9.2。

为了启用 SSL 数据库连接,我按照以下步骤操作:

  1. 创建自签名证书:参考:http ://www.postgresql.org/docs/9.2/static/ssl-tcp.html#SSL-CERTIFICATE-CREATION
  2. 将生成的server.crt并复制server.keypostgres/9.2/data文件夹中。
  3. 休眠连接的 URL:jdbc:postgresql://localhost:5432/DB_NAME?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory

重新启动 postgres 后,我运行我的应用程序,它给出的错误如下:

org.postgresql.util.PSQLException: The server does not support SSL.
    at org.postgresql.core.v3.ConnectionFactoryImpl.enableSSL(ConnectionFactoryImpl.java:307)
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:105)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:65)
    at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:140)
    at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:29)
    at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:21)
    at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:31)
    at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:23)
    at org.postgresql.Driver.makeConnection(Driver.java:393)
    at org.postgresql.Driver.connect(Driver.java:267)

即使我试图在pg_hba.conf文件末尾添加这一行,但 postgres 没有重新启动:

hostssl     all     all         127.0.0.1/32        trust

编辑

它适用于收到此类错误或想要添加数据库 ssl 连接的其他人:

我添加ssl = true和删除了对 ssl 相关条目的评论,postgresql.conf并且它起作用了。:)

4

4 回答 4

4

您的问题的根源似乎是您的服务器不支持 SSL 或未启用它。消息:

The server does not support SSL

只能在服务器拒绝或不理解 SSL 请求时由org/postgresql/core/v3/ConnectionFactoryImpl.javain发出。enableSSL(...)

果然,在您的更新中,您说您在postgresql.conf注释掉了与 SSL 相关的选项。它们被注释掉与它们根本不存在于服务器上是一样的;它会忽略它们。这将导致服务器说它不支持 SSL 并拒绝 SSL 连接,因为它不知道要发送什么服务器证书。发生这种情况时,PgJDBC 会报上述错误。

当您取消注释 SSL 选项postgresql.conf并重新启动服务器时,它开始工作。

您可能对以下事实感到困惑:

&ssl
&ssl=true
&ssl=false

所有人都做同样的事情:他们启用 SSL。是的,这有点疯狂。就像我们坚持的历史原因一样,但它清楚地记录在 JDBC 驱动程序参数参考中

ssl

使用 SSL 连接。驱动程序必须已使用 SSL 支持进行编译。此属性不需要与之关联的值。它的存在指定了 SSL 连接。但是,为了与未来版本兼容,首选值“true”。有关详细信息,请参阅第 4 章,使用 SSL。

如您所见,您仍然应该编写,ssl=true因为将来可能会发生变化。

阅读手册的服务器配置客户端配置部分将帮助您设置证书并将证书安装到本地证书列表中,这样您就不必禁用证书信任检查。

对于其他有此问题的人:您的 PostgreSQL 错误日志中会有更多详细信息,但我猜您的 PostgreSQL 配置不正确,或者您使用的是手动编译的 PostgreSQL,并且您没有使用 SSL 支持编译它。

于 2013-06-08T02:08:03.017 回答
1

如果您使用的是自签名证书,则需要将其添加到客户端 Java 安装的受信任密钥库中。

您可以在此处找到实现此目的的详细说明:告诉 java 接受自签名 ssl 证书

于 2013-06-07T09:27:56.223 回答
1

在您的连接字符串中,尝试

?sslmode=require

代替

?ssl=true
于 2014-03-07T14:44:11.740 回答
1

使用参数sslmode=disable。为我工作。带有 jdbc 驱动程序 SlickPostgresDriver 的 Postgresql 9.5。

于 2016-08-24T17:39:11.763 回答