在使用Microsoft JDBC驱动程序版本连接到SQL Server数据库时,我收到以下错误:
Com.microsoft.sqlserver.jdbc.SQLServerException:驱动程序无法使用安全套接字层加密与SQL Server建立安全连接。错误:“SQL Server返回不完整的响应。连接已关闭。ClientConnectionId:98d0b6f4-f3ca-4683-939e-7c0a0fca5931”.
我们最近将我们的应用程序从Java 6和Java 7升级到Java 8。所有运行Java的系统都运行SuSE Linux Enterprise Server 11(X86_64),Version=11,PATCHLEVEL=3。
以下是我通过编写的Java程序收集的事实,该程序只需按顺序打开和关闭1,000个数据库连接。
- 大约5%-10%的时间会断开连接,并出现此错误。并非每个连接都会出现该错误。
- 这个问题只在Java 8上出现。我在Java 7上运行了相同的程序,该问题不可重现。这与我们升级前的生产经验是一致的。我们在生产版的Java 7下运行时没有遇到任何问题。
- 并不是所有运行Java 8的Linux服务器都会出现这个问题,它只出现在其中的一些服务器上。这让我很困惑,但当我在不同Linux示例上的相同版本的Linux JVM(1.8.0_60,64位)上运行相同的测试程序时,一个Linux示例上不会出现这个问题,但其他示例上确实会出现这个问题。Linux示例运行相同版本的SuSE,并且它们处于相同的补丁级别。
- 连接到SQL Server 2008和SQL Server 2014服务器/数据库时出现问题。
- 无论我使用的是4.0版的SQL Server JDBC驱动程序还是较新的4.1版驱动程序,都会出现问题。
与网络上的其他人相比,我在这个问题上的独特之处在于,尽管这个问题只发生在Java 8上,但我无法让这个问题发生在运行相同Java 8 JVM的看似相同的Linux服务器上。其他人也在Java的早期版本中看到过这个问题,但这不是我们的经验。
如果您有任何意见、建议或意见,我们将不胜感激。
21条答案
按热度按时间eni9jsuy1#
我在Windows Server 2012 R2上也遇到过这个问题,使用的是带有Java 7的JDBC驱动程序4.0和4.1。这个Microsoft article将责任归咎于DHE密码套件,并建议在无法升级到JDBC驱动程序4.2的情况下禁用它们或降低它们的优先级
rmbxnbpk2#
将
;encrypt=true;trustServerCertificate=true
添加到Connection.url中。示例Jdbc:sqlserver://localhost\SQLEXPRESS:1433;databaseName=testdb;encrypt=true;trustServerCertificate=true
并检查POM文件中兼容的编译器版本Java与Maven的MSSQL-JDBC的JRE版本。像这样
和
编译器1.8和jre8
ozxc1zmp3#
将;ENCRYPT=TRUE;TRUSTSERVER证书=TRUE添加到Connection.url示例jdbc:sqlserver://localhost\SQLEXPRESS:1433;databaseName=testdb;encrypt=true;trustServerCertificate=true中,并检查pom文件中与Maven的msql-jdbc版本兼容的jre。像这样的enter image description here
cdmah0mi4#
对于我,我在两行之间加上
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
DriverManager.registerDriver(new com.microsoft.sqlserver.jdbc.SQLServerDriver());
Connection con = DriverManager.getConnection(connectionUrl);
因此,连接的最终代码为:
lokaqttq5#
在使用下面的连接字符串创建到数据库的连接时,我也遇到了同样的问题。
如下所示更新连接字符串后,它起作用了。
在这里,我在数据库名称后面添加了
encrypt=true;trustServerCertificate=true
。91zkwejq6#
我已经修复了我的本地环境的问题,它主要包括以下两个步骤。
1.如果您的项目是Maven构建的,切换JDBC驱动依赖关系如下:
2.另外替换驱动程序类名称:
3.修改JDBC URL如下:
yzxexxkh7#
我最近在运行RedHat 7的客户端服务器上进行了YUM更新后遇到了这个问题。由于上面的帖子并没有帮助我解决我的问题,所以我发布了这个答案。
问题:-RedHat中的Yum更新自动重新安装OpenJDK,我的应用程序使用Oracle JDK。验证默认JDK:
Java版本切换默认版本:
更新-替代方案--配置Java
有2个程序提供了‘Java’。
选择命令
1个Java-1.8.0-Openjdk.x86_64(/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el7_9.x86_64/jre/bin/java)
2/usr/java/jdk1.8.0_181-amd64/jre/bin/java
Enter保留当前选择[+],或键入选择编号:
在您想要给我们的适当版本旁边输入数字,然后按Enter键。
neekobn88#
8ftvxx2r9#
感谢@Sunil Kumar和@Joce。我使用了JAR和以下语法:
字符串myDriver=“com.microsoft.jdbc.sqlserver.SQLServerDriver”;
字符串myURL=“jdbc:sqlserver://DB_ipaddress\DB_instance;databaseName=DB_name;user=myusername;password=mypass;encrypt=true;trustServerCertificate=true;”;/==>此处的分号如图所示/
连接con=DriverManager.getConnection(MyURL);
uxh89sit10#
如果连接字符串中的服务器名称与SQL Server SSL证书中的服务器名称不匹配,则会发出以下错误:驱动程序无法使用安全套接字层(SSL)加密建立到SQL Server的安全连接。错误:“在安全套接字层(SSL)初始化期间,无法验证证书中的服务器名称。”
这帮助我解决了这个问题。正在使用ServerName中的本地主机,最终将JDBC连接字符串中的名称更改为CN能够连接的名称。
有关更多信息,请参阅:https://wiki.deepnetsecurity.com/pages/viewpage.action?pageId=1410867
trnvg8h311#
在我的例子中,问题是因为应用程序被设置为使用spring-boot-ext-security-starter-credhub-credential,而该设置存在一些问题。
因此,我从清单文件和POM中删除了CredHub,并以不同的方式获取凭据;然后错误就消失了。
gj3fmq9x12#
您的url应该如下所示,并添加SQL sqljdbc42.jar。这将解决您的问题
1l5u6lss13#
微软最近开放了他们的驱动程序。用户可以在GitHub上看到mssql-jdbc驱动程序活动。我猜最新的预览版是6.1.5。
你也可以在maven上找到所有的预览版本。同时支持JDK7和JDK8。
mzaanser14#
就像@2AGuy写的那样,你可以改变JVM参数。在我的例子中,我无法更改它,而使用了连接字符串“sslProtocol”参数,降低了到TLSV1的连接。
连接字符串:jdbc:sqlserver://:;encrypt=true;trustServerCertificate=true;sslProtocol=TLSv1;database=<DB名称>
uinbv5nw15#
在我的例子中,我有一个使用3DES_EDE_CBC算法的SQL服务器,这在JDK 1.8上默认是禁用的,所以检查
/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home/jre/lib/security/java.security
并从以下方面消除了该算法:
Jdk.tls.disabled算法=SSLv3、RC4、DES、MD5with RSA、DH密钥大小<1024、\EC密钥大小<224、3DES_EDE_CBC、ANON、NULL
对我很管用。