Spring 无法为数据库添加SSL支持
我正在使用Spring3、Hibernate4和postgres9.2 为了启用SSL数据库连接,我遵循以下步骤:Spring 无法为数据库添加SSL支持,spring,hibernate,postgresql,ssl,Spring,Hibernate,Postgresql,Ssl,我正在使用Spring3、Hibernate4和postgres9.2 为了启用SSL数据库连接,我遵循以下步骤: 正在创建自签名证书:请参阅: 将生成的server.crt和server.key复制到postgres/9.2/data文件夹中 hibernate连接的URL:jdbc:postgresql://localhost:5432/DB_NAME?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory 重新启动postgr
server.crt
和server.key
复制到postgres/9.2/data
文件夹中jdbc:postgresql://localhost:5432/DB_NAME?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory
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)
编辑
它适用于收到此类错误或希望添加数据库ssl连接的其他人:
我添加了
ssl=true
,并从postgresql.conf
中删除了与ssl相关的条目的注释,效果良好 如果您使用的是自签名证书,则需要将其添加到客户端Java安装的可信密钥存储中
您可以在此处找到实现此目的的详细说明:问题的根源似乎是您的服务器不支持SSL或未启用SSL。信息:
The server does not support SSL
只有当服务器拒绝或不理解SSL请求时,才能由enableSSL(…)
中的org/postgresql/core/v3/ConnectionFactoryImpl.java
发出
果然,在您的更新中,您说您在postgresql.conf
中注释了与SSL相关的选项。它们被注释掉与它们在服务器上根本不存在是一样的;它将忽略它们。这将导致服务器说它不支持SSL并拒绝SSL连接,因为它不知道要发送什么服务器证书。发生这种情况时,PgJDBC将报告上述错误
当您在postgresql.conf
中取消对SSL选项的注释并重新启动服务器时,它开始工作
您可能对以下事实感到困惑:
&ssl
&ssl=true
&ssl=false
它们都做同样的事情:它们启用SSL。是的,那有点疯狂。出于历史原因,我们一直坚持这样做,但是:
ssl
使用SSL连接。驱动程序必须使用SSL编译
支持。此属性不需要与之关联的值。这个
仅仅存在它就指定了SSL连接。然而,对于
与未来版本兼容,首选值“true”。对于
更多信息请参见第4章,使用SSL
如您所见,您仍然应该编写ssl=true
,因为这在将来可能会改变
阅读手册的和部分将帮助您设置证书并在本地证书列表中安装证书,这样您就不必禁用证书信任检查
对于有此问题的其他人:您的PostgreSQL错误日志中将有更多详细信息,但我猜您的PostgreSQL配置不正确,或者您使用的是手动编译的PostgreSQL,而您没有使用SSL支持编译它。在您的连接字符串中,请重试
?sslmode=require
而不是
?ssl=true
使用paramsslmode=disable。为我工作。带有jdbc驱动程序SlickPostgresDriver的Postgresql 9.5。感谢您的回复。但我解决了这个问题,并在我的问题中添加了它。很高兴听到。sslfactory=org.postgresql.ssl.NonValidatingFactory部分使您免于检查证书信任链。您从哪里获得postgresql?自编的?确保它真的在使用ssl,使用wireshark或tcpdump进行检查,并确保网络流量不在正常范围内。从你的更新中,你是说你在
postgresql.conf
中注释掉了SSL指令吗?@CraigRinger Thna谢谢你的建议。为了进行交叉检查,我添加了ssl=false,并在postgresql.conf
文件的ssl相关字段中添加了注释,然后它给出了类似服务器不支持ssl
的错误。那么我成功地配置了SSL了吗?如果您阅读文档,您会发现只要存在SSL
的任何值就足以打开它。因此ssl=false
和ssl=true
是一回事(与直觉相反)。我想问的是“添加/删除ssl相关条目的注释”是什么意思。你的意思是你把它们注释掉了,而你原来忘记取消注释了吗?是的。正是我的意思。。以下是之前评论过的行。然后我取消了它的注释:ssl\u ciphers='ALL:!ADH:!低:!经验:!MD5:@STRENGTH'ssl\u重新协商\u限制=512MB ssl\u证书文件='server.crt'ssl\u密钥文件='server.key'ssl\u ca\u文件='ssl\u crl\u文件='password\u加密=开启
?ssl=true