【问题标题】:The driver could not establish a secure connection to SQL Server by using SSL驱动程序无法使用 SSL 建立与 SQL Server 的安全连接
【发布时间】:2017-02-02 07:53:24
【问题描述】:

我在连接到 SQL 数据库时遇到问题。每当我尝试连接到 SQL 服务器时,我都会收到以下错误;

Caused by: org.hibernate.exception.JDBCConnectionException: Error calling Driver#connect
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:132)
    at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator$1$1.convert(BasicConnectionCreator.java:118)
    at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.convertSqlException(BasicConnectionCreator.java:140)
    at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:58)
    at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:75)
    at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:106)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:260)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:94)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
    at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1887)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1845)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:857)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:425)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:849)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:75)
    ... 143 more
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "SQL Server did not return a response. The connection has been closed. ClientConnectionId:.....".
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1667)
    at com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL(IOBuffer.java:1668)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1323)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:991)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:827)
    at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:1012)
    at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:55)
    ... 160 more
Caused by: java.io.IOException: SQL Server did not return a response. The connection has been closed. ClientConnectionId:.....
    at com.microsoft.sqlserver.jdbc.TDSChannel$SSLHandshakeInputStream.ensureSSLPayload(IOBuffer.java:651)
    at com.microsoft.sqlserver.jdbc.TDSChannel$SSLHandshakeInputStream.readInternal(IOBuffer.java:708)
    at com.microsoft.sqlserver.jdbc.TDSChannel$SSLHandshakeInputStream.read(IOBuffer.java:700)
    at com.microsoft.sqlserver.jdbc.TDSChannel$ProxyInputStream.readInternal(IOBuffer.java:895)
    at com.microsoft.sqlserver.jdbc.TDSChannel$ProxyInputStream.read(IOBuffer.java:883)
    at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
    at sun.security.ssl.InputRecord.read(InputRecord.java:503)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387)
    at com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL(IOBuffer.java:1618)
    ... 165 more

这是使用com.microsoft.sqlserver.jdbc.SQLServerDriver

每当我使用 JtDS 驱动程序(例如 this post 建议)时,我仍然无法连接到 SQL 服务器,并且出现以下错误。

Caused by: org.hibernate.exception.JDBCConnectionException: Error calling Driver#connect
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:132)
    at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator$1$1.convert(BasicConnectionCreator.java:118)
    at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.convertSqlException(BasicConnectionCreator.java:140)
    at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:58)
    at org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.createConnection(BasicConnectionCreator.java:75)
    at org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl.configure(DriverManagerConnectionProviderImpl.java:106)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:260)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:94)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
    at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1887)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1845)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:857)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:425)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:849)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:75)
    ... 143 more
Caused by: java.sql.SQLException: I/O Error: DB server closed connection.
    at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2481)
    at net.sourceforge.jtds.jdbc.TdsCore.login(TdsCore.java:632)
    at net.sourceforge.jtds.jdbc.JtdsConnection.<init>(JtdsConnection.java:371)
    at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:184)
    at org.hibernate.engine.jdbc.connections.internal.DriverConnectionCreator.makeConnection(DriverConnectionCreator.java:55)
    ... 160 more
Caused by: java.io.IOException: DB server closed connection.
    at net.sourceforge.jtds.jdbc.SharedSocket.readPacket(SharedSocket.java:852)
    at net.sourceforge.jtds.jdbc.SharedSocket.getNetPacket(SharedSocket.java:731)
    at net.sourceforge.jtds.jdbc.ResponseStream.getPacket(ResponseStream.java:477)
    at net.sourceforge.jtds.jdbc.ResponseStream.read(ResponseStream.java:114)
    at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2368)
    ... 164 more

我使用的连接字符串:(使用jtds)

jdbc:jtds:sqlserver://url.database.windows.net:[PORT];database=name;

或者不使用 jtds 时..

jdbc:sqlserver://url.database.windows.net:[PORT];database=name;

我还有一台服务器,它实际上能够使用这些配置运行并连接到数据库。我只是在尝试本地连接到数据库时不断收到这些错误。

我正在运行 macOS Sierra 10.21 版

jtds 版本:

<dependency>
    <groupId>net.sourceforge.jtds</groupId>
    <artifactId>jtds</artifactId>
    <version>1.3.1</version>
</dependency>

sqlserver 版本:

<dependency>
   <groupId>com.microsoft.sqlserver</groupId>
   <artifactId>sqljdbc4</artifactId>
   <version>4.0</version>
</dependency>

编辑:

我能够使用相同配置和不同网络上的同一台笔记本电脑连接到数据库。我只在家里的网络上收到此错误

【问题讨论】:

  • 对于 jTDS,默认为ssl=off。尝试将 ssl=requestssl=require 添加到 jTDS 连接 URL 的末尾。 (jTDS 有一个long-standing issue with SSL connections,这些都不适合我,但我没有去下载打补丁的 JAR 文件或类似的东西。) 至于微软的 JDBC 驱动程序,它在 Mac OS 上不受官方支持(根据“系统列出的要求here)。
  • 我明天试试这个。谢谢。
  • 此外,由于您似乎正在尝试连接到 Azure,因此您应该确保您使用的是 Microsoft JDBC 驱动程序的当前版本。 FWIW,我刚刚在“sqljdbc_6.0.7507.100_enu.tar.gz”中尝试了最新版本的 Microsoft 驱动程序,它在 Ubuntu 16.04 LTS 机器上的 SSL 上运行良好。尽管 macOS 可能不受官方支持,但网络搜索发现了许多声称 Microsoft JDBC 可以(或至少曾经)在 Mac 上工作的说法,例如,here
  • @GordThompson 几天前我很好,但这个错误开始随机出现.. 已经尝试重新安装 java 等。但没有成功......我会尽快尝试不同的网络,因为我认为它可能与此有关。感谢您的回复
  • 您的 Mac 笔记本电脑上的虚拟机中是否安装了 SQL 服务器,或者您的家庭网络中是否安装了不同的数据库服务器?您是否通过 VPN 访问数据库?能详细介绍一下网络吗?您使用的是什么版本的 SQL Server?什么版本的java?我在 SQL Server 2008,2012 中使用了官方的 microsoft 驱动程序,并且我有类似的错误,但可能不是相同的情况。抱歉所有问题。

标签: java sql-server ssl jdbc jtds


【解决方案1】:

我怀疑当您的笔记本电脑位于“不同网络”上时,它位于防火墙内,该防火墙也在保护您正在连接的数据库服务器。因此,在这种情况下建立数据库连接没有问题。

我认为您的“家庭网络”位于保护您尝试连接的数据库服务器的防火墙之外。因此,由于防火墙保护,您在这种情况下的数据库连接尝试将被忽略。

如果这些假设是正确的,您将需要联系“不同网络”的网络管理员以从您的家庭网络通过防火墙获得访问权限。

我希望这会有所帮助。

【讨论】:

  • 我会在今天晚些时候试试这个,如果它有效,请告诉你,谢谢!
  • 实际上并没有解决我的问题,它在一段时间后神奇地消失了。不过,对于遇到此问题的其他任何人来说一定很有用。
  • 当心,在没有解释的情况下神奇地消失的问题经常会再次发生。
【解决方案2】:

你的问题类似于https://youtrack.jetbrains.com/issue/IDEA-163324

解决办法是:

  • 打开终端
  • 运行scutil --getHostName
  • 如果主机名未设置或包含.local,则运行sudo scutil --set HostName "&lt;YOUR HOSTNAME HERE&gt;"

【讨论】:

    【解决方案3】:

    请让您的字符串url 如下所示,并在您的项目中添加sqljdbc42.jar

    url = "jdbc:sqlserver://" +serverName + ":1433;DatabaseName=" + dbName +";
    
    encrypt = true;
    
    trustServerCertificate=true;
    

    【讨论】:

      【解决方案4】:

      当您的 SQLJDBC 驱动程序 jar 旧时也会出现此异常。例如,如果您的 SQL 服务器是最新的 2018 或 2019,那么如果您使用旧的 JDBC jar 文件,如 sqljdbc4.0,那么您将收到此异常

      解决方案是采用最新的 jar 文件来支持 2018 或 2020 版本.. 我使用了下面的 jar 文件 mssql-jdbc-7.2.2.jre8.jar 解决问题。所以也要考虑这种方式

      【讨论】:

        【解决方案5】:

        用途:

        java.security.Security.setProperty("jdk.tls.disabledAlgorithms","");
        

        【讨论】:

          猜你喜欢
          • 2019-09-25
          • 2019-12-26
          • 1970-01-01
          • 2015-12-22
          • 2021-10-11
          • 1970-01-01
          • 2015-11-03
          • 2022-06-17
          • 2021-07-08
          相关资源
          最近更新 更多