Spring 无法为数据库添加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

我正在使用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
  • 重新启动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)
    
    编辑

    它适用于收到此类错误或希望添加数据库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