Java 8上的SQL Server JDBC错误:驱动程序无法使用安全套接字层(SSL)加密建立到SQL Server的安全连接

pgx2nnw8  于 2022-09-18  发布在  Java
关注(0)|答案(21)|浏览(491)

在使用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的早期版本中看到过这个问题,但这不是我们的经验。

如果您有任何意见、建议或意见,我们将不胜感激。

eni9jsuy

eni9jsuy1#

我在Windows Server 2012 R2上也遇到过这个问题,使用的是带有Java 7的JDBC驱动程序4.0和4.1。这个Microsoft article将责任归咎于DHE密码套件,并建议在无法升级到JDBC驱动程序4.2的情况下禁用它们或降低它们的优先级

rmbxnbpk

rmbxnbpk2#

;encrypt=true;trustServerCertificate=true添加到Connection.url中。示例

Jdbc:sqlserver://localhost\SQLEXPRESS:1433;databaseName=testdb;encrypt=true;trustServerCertificate=true

并检查POM文件中兼容的编译器版本Java与Maven的MSSQL-JDBC的JRE版本。像这样

<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>

<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>11.2.1.jre8</version>
</dependency>

编译器1.8和jre8

ozxc1zmp

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

cdmah0mi

cdmah0mi4#

对于我,我在两行之间加上Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

DriverManager.registerDriver(new com.microsoft.sqlserver.jdbc.SQLServerDriver());

Connection con = DriverManager.getConnection(connectionUrl);

因此,连接的最终代码为:

DriverManager.registerDriver(new com.microsoft.sqlserver.jdbc.SQLServerDriver());
    Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
    Connection con = DriverManager.getConnection(connectionUrl);
lokaqttq

lokaqttq5#

在使用下面的连接字符串创建到数据库的连接时,我也遇到了同样的问题。

DriverManager.getConnection("jdbc:sqlserver://" + host + ":" + port + ";databaseName=" + dbName + ";user=" + userName + ";password=" + password);

如下所示更新连接字符串后,它起作用了。

Connection con = DriverManager.getConnection("jdbc:sqlserver://" + host + ":" + port + ";databaseName=" + dbName + ";encrypt=true;trustServerCertificate=true;user=" + userName + ";password=" + password);

在这里,我在数据库名称后面添加了encrypt=true;trustServerCertificate=true

91zkwejq

91zkwejq6#

我已经修复了我的本地环境的问题,它主要包括以下两个步骤。

1.如果您的项目是Maven构建的,切换JDBC驱动依赖关系如下:

<dependency>
  <groupId>net.sourceforge.jtds</groupId>
  <artifactId>jtds</artifactId>
  <version>1.3.1</version>
</dependency>

2.另外替换驱动程序类名称:

ru.yandex.clickhouse.ClickHouseDriver

3.修改JDBC URL如下:

jdbc:jtds:sqlserver://xxxx:1433;databaseName=xxx
yzxexxkh

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键。

neekobn8

neekobn88#

  • 应用程序.属性:
spring.datasource.url=jdbc:sqlserver://YourServerName:1433;database=<YourDatabaseName>;encrypt=true;trustServerCertificate=true;
    spring.datasource.username=root
    spring.datasource.password=1234
    spring.datasource.driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
    spring.jpa.show-sql=true
    spring.jpa.hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect
    spring.jpa.properties.hibernate.globally_quoted_identifiers=true
    spring.jpa.hibernate.ddl-auto = create-drop
8ftvxx2r

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);

uxh89sit

uxh89sit10#

如果连接字符串中的服务器名称与SQL Server SSL证书中的服务器名称不匹配,则会发出以下错误:驱动程序无法使用安全套接字层(SSL)加密建立到SQL Server的安全连接。错误:“在安全套接字层(SSL)初始化期间,无法验证证书中的服务器名称。”

这帮助我解决了这个问题。正在使用ServerName中的本地主机,最终将JDBC连接字符串中的名称更改为CN能够连接的名称。

有关更多信息,请参阅:https://wiki.deepnetsecurity.com/pages/viewpage.action?pageId=1410867

trnvg8h3

trnvg8h311#

在我的例子中,问题是因为应用程序被设置为使用spring-boot-ext-security-starter-credhub-credential,而该设置存在一些问题。

因此,我从清单文件和POM中删除了CredHub,并以不同的方式获取凭据;然后错误就消失了。

gj3fmq9x

gj3fmq9x12#

您的url应该如下所示,并添加SQL sqljdbc42.jar。这将解决您的问题

url = "jdbc:sqlserver://" +serverName + ":1433;DatabaseName=" + dbName + ";encrypt=true;trustServerCertificate=true;
1l5u6lss

1l5u6lss13#

微软最近开放了他们的驱动程序。用户可以在GitHub上看到mssql-jdbc驱动程序活动。我猜最新的预览版是6.1.5。

你也可以在maven上找到所有的预览版本。同时支持JDK7和JDK8。

mzaanser

mzaanser14#

就像@2AGuy写的那样,你可以改变JVM参数。在我的例子中,我无法更改它,而使用了连接字符串“sslProtocol”参数,降低了到TLSV1的连接。
连接字符串:jdbc:sqlserver://:;encrypt=true;trustServerCertificate=true;sslProtocol=TLSv1;database=<DB名称>

uinbv5nw

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

对我很管用。

相关问题