我使用标准驱动程序 com.microsoft.sqlserver.jdbc.SQLServerDriver 连接到 MSSQL 服务器。我在 Eclipse 中运行我的程序并遇到错误:
Failed to obtain JDBC Connection; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException:
The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption.
Error: "The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]"
我的环境是openjdk版本“11.0.11”2021-04-20 LTS并且该项目在Eclipse中使用相同的JRE系统库。奇怪的是,我将我的项目打包到 JAR 中,它在另一台机器上运行良好,即 openjdk version "11.0.9.1" 2020-11-04 LTS.
几个月前,我可以在开发环境中运行我的程序,但现在失败了。这段时间可能对开发环境做了一些改动,所以不知道和JDK版本有没有关系
欢迎任何提示,并提前谢谢您。
感谢施密茨IT!该线程实际上引导我找到一个可行的解决方案,我想在此处重新发布该解决方案以记录!
https://aws.amazon.com/blogs/opensource/tls-1-0-1-1-changes-in-openjdk-and-amazon-corretto/
上面的文章有一些对我有用的有价值的信息:
PS。但是添加一个文件enableLegacyTLS.security来覆盖java.security中的设置对我来说不起作用(OpenJDK 11)。不知道为什么。
我最近遇到了这个问题,这是因为我尝试使用最新版本的 SQL Server JDBC 驱动程序(版本 12.2.0)连接到旧版本的 Microsoft SQL Server(2012 年,版本 11.00.3156)较新版本的 JDK(版本 11.0.15)。
发生这种情况是因为新版本的 JDK 默认情况下禁用一些旧的安全算法,如 TLSv1.0(有利于旧的 SQL Server 需要的安全算法,如 TLSv1.2/TLSv1.3)。
为了解决这个问题,我将 JDBC 驱动程序更改为旧版本 8.2.2,并且必须将一些 java 安全虚拟机选项传递给 JDK 以覆盖一些安全配置并从禁用的算法中删除 TLSV1.0
传递给 JDK 的 VM 选项
-Djdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL
(注意,TLSv1.0和TLSv1.1已从原来的JDK列表中删除)
这样做我成功连接到旧的 SQL Server 2012。希望这对您有帮助