sqlserver连接异常
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 [TLS12]". ClientConnectionId:eeee8314-1ca8-4fc0-ab7a-34df281ba52c
原因:由 Java 程序与 SQL Server 之间的 TLS(传输层安全)协议版本不匹配所致。
1、SQL Server2014及更早版本不支持[TLS 1.2]。
2、Java 8 开始,TLS 1.0 被默认禁用。(启用 TLS 1.0 可能会降低安全性)
因为 TLS 1.0 版本较老,相对不安全,Java 默认会禁用 TLS 1.0,而要求使用较新的 TLS 1.2 或 TLS 1.3 协议。一般通过修改 java.security 中被禁用的协议,将 TLS 1.0 放出来就可以解决。
SQL Server2014及更早版本不支持[TLS 1.2]。这些版本在服务器上去掉TLS 1.0和1.1后,可能会出现SQL服务无法启动的问题。
--查看sqlserver版本
SELECT
@@VERSION;
SELECT
SERVERPROPERTY( 'ProductVersion' ) AS ProductVersion,
SERVERPROPERTY( 'ProductLevel' ) AS ProductLevel,
SERVERPROPERTY( 'Edition' ) AS Edition;
java支持TLS 1.0方法
方法一:
打开文件 C:\local\Java\jdk1.8.0_321\jre\lib\security\java.security
搜索关键词 tls.disabledAlgorithms
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \ DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \ include jdk.disabled.namedCurves
删除TLSv1, TLSv1.1,
方法二:
启用 TLS 1.0 的 JVM 参数:
-Djdk.tls.client.protocols=TLSv1.2,TLSv1.1,TLSv1
方法三:
java 应用程序内部设置,可以通过代码设置:
import java.security.Security;
public class TLSConfiguration {
public static void main(String[] args) {
Security.setProperty("jdk.tls.client.protocols", "TLSv1.2,TLSv1.1,TLSv1");
}
}
sqlserver处理办法
1、升级版本。SQL Server 2016或更高版本原生支持TLS 1.2。因此,如果可能的话,升级到更高版本的SQL Server是一个直接的解决方案。
2、安装更新。如果必须在SQL Server 2012上实现TLS 1.2支持,则需要安装特定的累积更新(CU)或服务包(SP),这些更新包含了TLS 1.2的支持。具体可参考Microsoft的知识库文章,如3135244对Microsoft SQL Server的TLS 1.2支持所需的System Center 2012 R2更新。通过手动设置或使用注册表文件来启用TLS 1.2。