代码之家  ›  专栏  ›  技术社区  ›  Bemipefe

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

  •  3
  • Bemipefe  · 技术社区  · 8 年前

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

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

    驱动程序无法通过建立到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 回复  |  直到 8 年前
        1
  •  13
  •   Gord Thompson    8 年前

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

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

        2
  •  0
  •   howserss    6 年前

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

    ***ClientHello,TLSv1 ... 主,写入:TLSv1握手 ... main,称为close() main,称为closeInternal(true) 主,发送TLSv1.2警报:警告,描述=关闭\u通知 主,写入:TLSv1.2警报,长度=2