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

flvlnr44  于 2022-09-18  发布在  Java
关注(0)|答案(2)|浏览(461)

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

但是,当我尝试使用Java代码和JDBC驱动程序建立到SQL服务器的连接sqljdbc42.jar时,抛出以下异常:
驱动程序无法使用安全套接字层(SSL)加密建立到SQL Server的安全连接。错误:“SQL Server未返回响应。连接已关闭。

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,但是使用TLSv1来完成“客户端Hello”:

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

a64a0gku

a64a0gku1#

较早版本的Microsoft用于SQL Server的JDBC驱动程序显然假定TLS v1.1将在服务器上可用。也就是说,它们的编码不能处理服务器显式拒绝(或忽略)TLSV1.1流量的情况。

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

wlsrxk51

wlsrxk512#

最新版本的驱动程序为我修复了这个问题。从这里下载的https://docs.microsoft.com/en-us/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-ver15版本,用于JBoss 7.2服务器。在这个版本中,我不需要向我的连接URL添加任何东西。我必须修改我的mode.xml以使用新的文件名,但不需要更改依赖项部分。我得到了同样的回应,这解决了问题。我没有像OP提到的那样添加任何-D JVM选项。

  • ClientHello,TLSv1...主,写道:TLSv1握手...Main,名为Close()Main,名为CloseInternal(True)Main,发送TLSv1.2警报:警告,Description=CLOSE_NOTIFY Main,WRITE:TLSv1.2警报,长度=2

相关问题