首页 > 解决方案 > TLSv1.2 从 Java 到 SQL Server

问题描述

SQL Server 2017。Java 8 (u251)。sqljdbc42.jar。

我通过这个禁用了低于 TLS 1.2 的 SSL 版本。我已经通过这个启用了 TLSv1.2 。我已经通过这个安装了证书。

用于创建和使用连接的代码是:

Connection connection = null;
String url = "jdbc:sqlserver://" + dbServerIp + ":" + dbServerPort + ";databaseName=" + dbName + ";sslProtocol=TLSv1.2;encrypt=true;trustServerCertificate=true";
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
connection = DriverManager.getConnection(url, dbUserName, dbPassword);

但它一直在失败。在 java 中,我正在获取堆栈跟踪,其中包含以下消息

com.microsoft.sqlserver.jdbc.SQLServerException:驱动程序无法使用安全套接字层 (SSL) 加密建立与 SQL Server 的安全连接。错误:“SQL Server 未返回响应。连接已关闭。”。

而 Wireshark 跟踪显示一个TDS7 pre-login message,然后是a,然后是TDS7 Responsea TDS7 pre-login message TLS Exchange,然后是一堆 FIN 和 ACK。

这些消息都不是很有帮助。当我使用带有加密选项的 SQL Server Management Studio 时,它工作正常。我需要弄清楚为什么我的 Java 代码失败了,但是我整天都没有得到任何结果。

编辑:我更新到 mssql-jdbc-8.2.2.jre8.jar 也没有帮助。一时兴起,我试着看看另一个使用 Hibernate 的应用程序现在是否仍然可以连接,因为服务器正在强制 TLS 1.2,并且根本不更改应用程序或 Hibernate 的配置中的任何内容......它就可以工作。我在 Wireshark 中看到很多流量,包括TLS Exchanges 等等。在这种通过 Java 手动连接的特殊方式上,我一定遗漏了一些非常基本的东西(这是与使用 Hibernate 的应用程序不同的应用程序)。

标签: javasql-servertls1.2

解决方案


推荐阅读