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

时间:2018-01-26 15:54:13

标签: java sql-server jdbc

我将SQL Server 2014更新到最新的修订包( 12.0.5207 )。在环境中,启用的唯一协议是TLS1.2(已为此目的设置了注册表项)。我可以使用管理工作室本地和远程使用SA帐户连接到SQL服务器。

但是,当我尝试使用java代码和JDBC驱动程序 sqljdbc42.jar 建立与SQL服务器的连接时,抛出以下异常:

  

驱动程序无法与SQL Server建立安全连接   使用安全套接字层(SSL)加密。错误:“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,但“客户端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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

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

*** ClientHello,TLSv1 ... 主,写:TLSv1握手 ... 主要,称为close() 主要,称为closeInternal(true) main,SEND TLSv1.2 ALERT:警告,描述= close_notify main,WRITE:TLSv1.2警报,长度= 2