SQL Server JDBC Error: The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption
SQL Server JDBC Error: The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption
背景:
- 应用程序服务器:
Java 基于 运行 的应用程序在 Windows Server 2008 R2 Enterprise 上。
Java 此服务器上的版本是版本 6 更新 32。
JDBC驱动版本:4.0
- 数据库服务器:
数据库服务器最近已从 Windows 2016 升级到 Windows 2019 和 SQL Server 2012 到 SQL Server 2016 并且此服务器上没有 Java。有问题吗??
- 历史:
我们上次将数据库服务器从 SQL Server 2008 升级到 SQL Server 2012 时,我们采用相同的方法,应用程序运行良好。
但是这次它在应用程序日志中抛出以下错误:
org.jboss.resource.JBossResourceException: 无法创建连接; - 嵌套可抛出物:(com.microsoft.sqlserver.jdbc.SQLServerException:
驱动程序无法使用安全套接字层 (SSL) 加密与 SQL 服务器建立安全连接。错误:"SQL Server did not return a response. The connection has been closed.".)
我们根本没有接触应用服务器,期望当数据库服务器启动时,因为它是相同的服务器名称,它会正常启动备份,但是应用程序失败并出现上述错误。
没有登录失败,因为我们测试了应用程序登录名和密码,它工作正常。
我查看了以下内容:
但我们似乎无法理解是什么导致了这个问题,因为应用服务器上没有任何变化。
我查看了 JDBC 版本和 SQL 服务器矩阵之间的兼容性
https://docs.microsoft.com/en-us/sql/connect/jdbc/microsoft-jdbc-driver-for-sql-server-support-matrix?view=sql-server-2017 看起来 JDBC 4.0 可以与 SQL 一起使用服务器 2016.
关于可能发生的事情有什么想法吗?
好的,我们就此问题与 Microsoft 支持部门合作,这是我们达成的共识。
Microsoft added/enabled 数据库服务器的 TLS 1.0 和 TLS 1.1 仅用于测试目的,因为 Microsoft 不再支持 TLS 1.0。这将安全协议降低到较低状态,但能够在应用程序服务器和数据库服务器之间建立 SQL 连接,但应用程序最初仍无法连接。 Microsoft 认为这是因为应用程序正在使用当前连接 provider/driver,他们不会支持它的那部分,因为那是 Java/Oracle 的 JDBC 驱动程序。
在我们的例子中,应用程序在启用 TLS 1.0 和 TLS 1.1 一段时间后确实连接了。
这可能适用于您的情况,也可能无效。
因此,如果您有资源修改应用程序,建议的解决方案是更新应用程序的驱动程序、测试和重新部署。
如果您没有应用程序的资源,则选项如下:
1.Rollback 到 SQL 服务器的旧服务器。这可能有效,但不能保证。
还要注意的另一件事是 SQL Server 2008 和 2008R2 不受支持,因此我们可以使用的最旧的(并且仍然受支持)将是 SQL Server 2012,它可能无法解决问题。
2.Open 安全大开。这很可能会解决问题,但绝对不推荐。该问题可能与不再受支持的极其过时的安全提供程序有关。因此,将安全性完全打开可能会解决问题,但不建议这样做。
3.Rewrite 应用程序不是最简单的选择,但却是唯一一个被微软完全推荐的应用程序。
如果您想自己启用 TLS,请参阅此 https://serverfault.com/questions/649052/do-i-have-to-enable-tls-1-0-in-windows-2008-r2 and this https://www.youtube.com/watch?v=vUuR_M3biDU。进行此更改后,服务器将需要重新启动。
尝试添加“trustServerCertificate=true;”到连接字符串示例:
jdbc:sqlserver://NEUTRON\SQL2017;user=sa;password=password123;integratedSecurity=false;trustServerCertificate=true;
背景:
- 应用程序服务器:
Java 基于 运行 的应用程序在 Windows Server 2008 R2 Enterprise 上。 Java 此服务器上的版本是版本 6 更新 32。 JDBC驱动版本:4.0
- 数据库服务器:
数据库服务器最近已从 Windows 2016 升级到 Windows 2019 和 SQL Server 2012 到 SQL Server 2016 并且此服务器上没有 Java。有问题吗??
- 历史:
我们上次将数据库服务器从 SQL Server 2008 升级到 SQL Server 2012 时,我们采用相同的方法,应用程序运行良好。
但是这次它在应用程序日志中抛出以下错误:
org.jboss.resource.JBossResourceException: 无法创建连接; - 嵌套可抛出物:(com.microsoft.sqlserver.jdbc.SQLServerException:
驱动程序无法使用安全套接字层 (SSL) 加密与 SQL 服务器建立安全连接。错误:"SQL Server did not return a response. The connection has been closed.".)
我们根本没有接触应用服务器,期望当数据库服务器启动时,因为它是相同的服务器名称,它会正常启动备份,但是应用程序失败并出现上述错误。 没有登录失败,因为我们测试了应用程序登录名和密码,它工作正常。
我查看了以下内容:
https://docs.microsoft.com/en-us/sql/connect/jdbc/microsoft-jdbc-driver-for-sql-server-support-matrix?view=sql-server-2017 看起来 JDBC 4.0 可以与 SQL 一起使用服务器 2016.
关于可能发生的事情有什么想法吗?
好的,我们就此问题与 Microsoft 支持部门合作,这是我们达成的共识。
Microsoft added/enabled 数据库服务器的 TLS 1.0 和 TLS 1.1 仅用于测试目的,因为 Microsoft 不再支持 TLS 1.0。这将安全协议降低到较低状态,但能够在应用程序服务器和数据库服务器之间建立 SQL 连接,但应用程序最初仍无法连接。 Microsoft 认为这是因为应用程序正在使用当前连接 provider/driver,他们不会支持它的那部分,因为那是 Java/Oracle 的 JDBC 驱动程序。
在我们的例子中,应用程序在启用 TLS 1.0 和 TLS 1.1 一段时间后确实连接了。 这可能适用于您的情况,也可能无效。
因此,如果您有资源修改应用程序,建议的解决方案是更新应用程序的驱动程序、测试和重新部署。
如果您没有应用程序的资源,则选项如下: 1.Rollback 到 SQL 服务器的旧服务器。这可能有效,但不能保证。 还要注意的另一件事是 SQL Server 2008 和 2008R2 不受支持,因此我们可以使用的最旧的(并且仍然受支持)将是 SQL Server 2012,它可能无法解决问题。
2.Open 安全大开。这很可能会解决问题,但绝对不推荐。该问题可能与不再受支持的极其过时的安全提供程序有关。因此,将安全性完全打开可能会解决问题,但不建议这样做。
3.Rewrite 应用程序不是最简单的选择,但却是唯一一个被微软完全推荐的应用程序。
如果您想自己启用 TLS,请参阅此 https://serverfault.com/questions/649052/do-i-have-to-enable-tls-1-0-in-windows-2008-r2 and this https://www.youtube.com/watch?v=vUuR_M3biDU。进行此更改后,服务器将需要重新启动。
尝试添加“trustServerCertificate=true;”到连接字符串示例: jdbc:sqlserver://NEUTRON\SQL2017;user=sa;password=password123;integratedSecurity=false;trustServerCertificate=true;