背景:
基于Java的应用程序正在Windows Server 2008 R2 Enterprise上运行。 此服务器上的Java版本是版本6更新32。 JDBC驱动程序版本:4.0
数据库服务器最近已从Windows 2016升级到Windows 2019,从SQL Server 2012升级到SQL Server 2016(与应用程序用于连接之前的服务器名称并排升级)在此服务器上。这有问题吗?
上次从SQL Server 2008升级到SQL Server 2012时,我们采用了相同的方法,应用程序运行良好。
但是这一次它在应用程序日志中引发了以下错误:
org.jboss.resource.JBossResourceException:无法创建连接。 -嵌套的throwable:(com.microsoft.sqlserver.jdbc.SQLServerException:
驱动程序无法使用安全套接字层(SSL)加密建立与SQL Server的安全连接。错误:“ SQL Server未返回响应。连接已关闭。”。
我们根本没有碰过应用程序服务器,希望当数据库服务器启动时,由于它是相同的服务器名,因此可以正常启动,但是应用程序由于上述错误而失败。 没有登录失败,因为我们测试了应用程序的登录名和密码,并且工作正常。
我看了以下内容:
SQL Server JDBC Error on Java 8: The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption
但是我们似乎无法理解导致此问题的原因,因为Application Server上的任何内容均未更改。
我在这里查看了JDBC版本与SQL Server矩阵之间的兼容性
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 Server 2016兼容。
关于可能会发生什么的任何想法?
答案 0 :(得分:0)
好吧,所以我们与Microsoft支持团队合作解决了这个问题,这就是我们的理解。
Microsoft仅出于测试目的而向数据库服务器添加/启用了TLS 1.0和TLS 1.1,因为Microsoft不再支持TLS 1.0。这将安全协议降低到较低的状态,但是能够在应用程序服务器和数据库服务器之间建立SQL连接,但是应用程序最初仍然无法连接。微软认为这是因为该应用程序正在使用当前的连接提供程序/驱动程序,并且他们不支持该部分,因为那是Java / Oracle的JDBC驱动程序。
在我们的情况下,应用程序在启用TLS 1.0和TLS 1.1之后确实连接了一段时间。 在您的情况下,这可能行不通。
因此,如果您有足够的资源来修改应用程序,建议的解决方案是为应用程序更新驱动程序,进行测试并重新部署。
如果您没有应用程序的资源,则这些选项为: 1.回滚到较旧的SQL Server服务器。这可能有效,但不能保证。 还要注意的另一件事是,SQL Server 2008和2008R2不在支持范围内,因此我们最早可以使用(并且仍然保持受支持)的SQL Server 2012可能无法解决问题。
2。将安全性完全打开。这很有可能解决问题,但是绝对不建议这样做。该问题可能与不再受支持的过时的安全提供程序有关。因此,打开您的安全性可能会解决此问题,但是不建议这样做。
3。重写该应用程序不是最简单的选择,但是它是Microsoft完全推荐的唯一应用程序。
如果您想自己启用TLS,请参见此https://serverfault.com/questions/649052/do-i-have-to-enable-tls-1-0-in-windows-2008-r2和此https://www.youtube.com/watch?v=vUuR_M3biDU。进行此更改后,服务器将需要重新启动。