当前位置: 首页 > 面试题库 >

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

阎智
2023-03-14
问题内容

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

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

驱动程序无法使用安全套接字层(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完成了“客户端问候”:

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驱动程序版本6.3.2开始,我们可以添加;sslProtocol=TLSv1.2到连接URL中以指定要使用的TLS版本。



 类似资料:
  • 问题内容: 我正在Eclipse Juno中开发JavaEEWeb应用程序。我已将Tomcat配置为与PostgreSQL数据库一起使用JDBC连接池(org.apache.tomcat.jdbc.pool)。这是我的项目的META-INF / context.xml中的配置: 我的应用程序是使用Eclipse部署到Tomcat的,并且在Tomcat的context.xml中,可重载属性设置为“

  • 我正在Eclipse Juno中开发一个Java EE web应用程序。我已经将Tomcat配置为使用JDBC连接池(org.apache.Tomcat.JDBC.pool)和PostgreSQL数据库。以下是我项目的META-INF/context.xml中的配置: 我的应用程序使用Eclipse部署到Tomcat,在Tomcat的context.xml中,一个属性reloadable被设置为“

  • 我正在EclipseJuno中开发一个JavaEEWeb应用程序。我已经将Tomcat配置为使用JDBC连接池(org.apache.Tomcat.JDBC.pool)和PostgreSQL数据库。以下是我的项目META-INF/context中的配置。xml: 我的应用程序使用Eclipse部署到Tomcat,在Tomcat的context.xml属性reloadable设置为"true",以便

  • 我正试图通过JSTL连接JDBC。我的Localhost ie:Xampp连接也完成了,但我还是遇到了无法解决的错误。请帮忙!我使用的是Netbeans 8.0.2。下面是代码。[1]: https://i.stack.imgur.com/R4AUp.png[这是我得到的错误][1] 我还添加了“mysql-connector-java-5.1.23-bin”。jar'是Web服务器的lib目录。

  • 问题内容: 我们使用JDBC的标准代码部分是… 问题1:使用连接池时,是否应该在最后关闭连接?如果是这样,合并的目的就不会丢失吗?如果不是,那么DataSource如何知道何时释放Connection的特定实例并可以重用?我对此感到有些困惑,任何指针都表示赞赏。 问题2:以下方法是否接近标准?看起来像是尝试从池中获取连接,并且如果无法建立DataSource,请使用老式的DriverManager

  • 我正在尝试使用重试逻辑来获取JDBC连接,以防出现SQL异常,例如: 我目前无法测试,因此需要一些帮助。 如果我遇到异常,然后重试后可以登录,这将很好地工作。但是如果我们没有得到异常,它将到达finally块并关闭连接。最后试着抓住里面的while循环。 所以如果我关闭我的连接,流动如果达到 while(null==连接) 我的连接对象在关闭后会变为null吗? 或者是否有其他方法来实现重试部分?