java - 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 Response
a 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 Exchange
s 等等。在这种通过 Java 手动连接的特殊方式上,我一定遗漏了一些非常基本的东西(这是与使用 Hibernate 的应用程序不同的应用程序)。
解决方案
推荐阅读
- java - 如何使用 Angular 和 Spring Boot RESTful Api 清理或沙盒用户输入
- python - Kivy Android:无法在 TextInput 中输入日语(或中文)
- javascript - 组合大写和小写搜索选项不适用于角度
- python - twinx 弄乱了 pcolormesh 情节的颜色条
- asp.net-mvc - 动态使用openxml在ppt中的多张幻灯片中划分表格
- database - 无法在多节点 TimescaleDB 设置上创建分布式超表
- r - 有没有办法在 R 中使用 spatstat 创建 ppp 对象列表?
- python - 如何计算 Pytorch 中的平均相对绝对误差
- python - 如何使用 C# 调用 Python 3.9 脚本
- r - R如何在运行长度中保存唯一值的同时删除重复值