gpt4 book ai didi

Java 1.8.0 在 JDBC 连接中启用 TLS1.2

转载 作者:行者123 更新时间:2023-12-01 17:52:30 26 4
gpt4 key购买 nike

我有一个已更新到最新补丁包 (12.0.5207) 的 SQL Server 2014。在该环境中,唯一启用的协议(protocol)是 TLS1.2(已为此目的设置注册表项)。我可以使用 Management Studio 在本地和远程使用 SA 帐户连接到 SQL 服务器。

但是,当我尝试使用 java 代码和 JDBC 驱动程序 sqljdbc42.jar 建立与 SQL Server 的连接时,会引发以下异常:

The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "SQL Server did not return a response. The connection has been closed.

java代码如下:

public static void main(String[] args) 
{
try
{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
}
catch (ClassNotFoundException e)
{
System.out.println( e.toString() );
}

String connectionUrl = "jdbc:sqlserver://localhost:1433;" +
"databaseName=TRCDB;user=sa;password=**********;";
try
{
Connection con = DriverManager.getConnection(connectionUrl);
}
catch (SQLException e)
{
System.out.println( e.toString() );
}
}

当 JVM 启动时,会传递以下选项:

-Djavax.net.debug=all -Djdk.tls.client.protocols="TLSv1.2" -Dhttps.protocols="TLSv1.2"

因此,尽管仅启用了 TLSv1.2,但“Client Hello”是使用 TLSv1 完成的:

jdk.tls.client.protocols is defined as TLSv1.2 SSLv3 protocol was requested but was not enabled 
SUPPORTED: [TLSv1, TLSv1.1, TLSv1.2]
SERVER_DEFAULT: [TLSv1, TLSv1.1, TLSv1.2]
CLIENT_DEFAULT: [TLSv1.2]
...
*** ClientHello, TLSv1
...
main, WRITE: TLSv1 Handshake
...
main, called close()
main, called closeInternal(true)
main, SEND TLSv1.2 ALERT: warning, description = close_notify
main, WRITE: TLSv1.2 Alert, length = 2

问题的根本原因是 TLS 版本吗?如何强制使用 TLSv1.2

最佳答案

旧版本的 Microsoft SQL Server JDBC 驱动程序显然假定 TLS v1.1 将在服务器上可用。也就是说,它们没有经过编码来处理服务器明确拒绝(或忽略)TLS v1.1 流量的情况。

从 JDBC 驱动程序开始 version 6.3.2我们可以将 ;sslProtocol=TLSv1.2 添加到我们的连接 URL 中以指定要使用的 TLS 版本。

关于Java 1.8.0 在 JDBC 连接中启用 TLS1.2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48464863/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com