我正在使用Spring3,Hibernate4和postgres9.2。
为了启用SSL数据库连接,我按照以下步骤操作:
server.crt
和server.key
复制到postgres/9.2/data
文件夹中。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
并删除了postgresql.conf
中与ssl相关的条目的评论,但它确实有效。 :)
答案 0 :(得分:3)
问题的根源似乎是您的服务器不支持SSL或未启用SSL。消息:
The server does not support SSL
当服务器拒绝或不理解SSL请求时,只能由org/postgresql/core/v3/ConnectionFactoryImpl.java
enableSSL(...)
发出。
果然,在您的更新中,您说您已在postgresql.conf
注释掉中的SSL相关选项。被注释掉的是与他们根本不在服务器上的相同;它会忽略它们。这将导致服务器说它不支持SSL并拒绝SSL连接,因为它不知道要发送什么服务器证书。当发生这种情况时,PgJDBC将报告上述错误。
当您在postgresql.conf
中取消注释SSL选项并重新启动服务器时,它开始工作。
您可能对以下事实感到困惑:
&ssl
&ssl=true
&ssl=false
都做同样的事情:他们启用SSL。是的,那有点疯狂。就像历史原因那样,我们一直坚持,但它是clearly documented in the JDBC driver parameter reference:
SSL 的
使用SSL连接。驱动程序必须已使用SSL编译 支持。此属性不需要与之关联的值。该 仅存在它就指定了SSL连接。但是,对于 与未来版本的兼容性,值“true”是首选。对于 更多信息,请参阅第4章,使用SSL。
正如您所看到的,您仍然应该写ssl=true
,因为将来可能会发生变化。
阅读本手册的server configuration和client configuration部分将帮助您设置证书并在本地证书列表中安装证书,这样您就不必禁用证书信任检查。
对于有此问题的其他人:PostgreSQL错误日志中会有更多详细信息,但我的猜测是你的PostgreSQL配置不对,或者你正在使用手工编译的PostgreSQL而你没有用它编译它SSL支持。
答案 1 :(得分:1)
如果您使用的是自签名证书,则需要将其添加到客户端Java安装的可信密钥存储区中。
您可以在此处找到详细说明:telling java to accept self-signed ssl certificate
答案 2 :(得分:1)
在您的连接字符串中,尝试
?sslmode=require
而不是
?ssl=true
答案 3 :(得分:1)
使用param sslmode = disable 。为我工作。带有jdbc驱动程序的Postgresql 9.5 SlickPostgresDriver。