• JDBC连接SQLService时报错误:“驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接"


    1.环境

    • IDE : IDEA
    • JDK : JAVA1.8
    • SQLServer版本 : SQL Server 2008

    2.具体报错信息

    2019-09-16 17:43:11 [Druid-ConnectionPool-Create-847839957] ERROR c.a.d.p.DruidDataSource - create connection SQLException, url: jdbc:sqlserver://localhost;DatabaseName=PT_STORE_HLW, errorCode 0, state 08S01
    com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“SQL Server 未返回响应。连接已关闭。 ClientConnectionId:22dc49b0-221d-4a51-9a84-8d507658df6e”。
    	at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:1667)
    	at com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL(IOBuffer.java:1668)
    	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1323)
    	at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:991)
    	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:827)
    	at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:1012)
    	at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:156)
    	at com.alibaba.druid.filter.stat.StatFilter.connection_connect(StatFilter.java:218)
    	at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:150)
    	at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1560)
    	at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1623)
    	at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2468)
    Caused by: java.io.IOException: SQL Server 未返回响应。连接已关闭。 ClientConnectionId:22dc49b0-221d-4a51-9a84-8d507658df6e
    	at com.microsoft.sqlserver.jdbc.TDSChannel$SSLHandshakeInputStream.ensureSSLPayload(IOBuffer.java:651)
    	at com.microsoft.sqlserver.jdbc.TDSChannel$SSLHandshakeInputStream.readInternal(IOBuffer.java:708)
    	at com.microsoft.sqlserver.jdbc.TDSChannel$SSLHandshakeInputStream.read(IOBuffer.java:700)
    	at com.microsoft.sqlserver.jdbc.TDSChannel$ProxyInputStream.readInternal(IOBuffer.java:895)
    	at com.microsoft.sqlserver.jdbc.TDSChannel$ProxyInputStream.read(IOBuffer.java:883)
    	at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
    	at sun.security.ssl.InputRecord.read(InputRecord.java:503)
    	at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:975)
    	at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367)
    	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1395)
    	at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1379)
    	at com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL(IOBuffer.java:1618)
    	... 10 common frames omitted
    

     

    解决过程:

      在网上百度有的说是因为JDK1.6的问题,可是我用的是JDK1.8

      也有说是jre缺少两个jar包,尝试后并不是这个原因

    解决:

    在 JDK 8 及更早版本中,编辑该 /lib/security/java.security 文件并 3DES_EDE_CBC 从 jdk.tls.legacyAlgorithms 安全属性中删除。
    官方文档指出:请注意,这是一个低风险的更改。它不太可能导致回归,因为它只会影响协商算法的顺序。如果没有其他非遗留算法可用,则仍将使用 3DES(如果在遗留算法列表上列出)。

    把 jdk 下面的 java.security 中的,去掉 3DES_EDE_CBC 可以使用 jdbc 连上 sqlserver。

    在 Java 8 默认禁用【加密套件】:“SSL_RSA_WITH_3DES_EDE_CBC_SHA”.
    然后要连接成功的话,要开启 “SSL_RSA_WITH_3DES_EDE_CBC_SHA”,找到的答案是:
    打开文件夹(JAVA_HOME)/jre/lib/security 中的安全策略文件:Java.security
    修改 jdk.tls.disabledAlgorithms 选项。
    Java 8 的 jdk.tls.disabledAlgorithms 默认值:
    jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
    jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 1024,
    EC keySize < 224, DES40_CBC, RC4_40,3DES_EDE_CBC

    为了开启 SSL_RSA_WITH_3DES_EDE_CBC_SHA,将 3DES_EDE_CBC 注释掉:

    Java 8 的 jdk.tls.disabledAlgorithms 默认值:
    jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
    jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 1024,
    EC keySize < 224, DES40_CBC, RC4_40
    #,3DES_EDE_CBC

  • 相关阅读:
    线程池
    自定义死锁
    不安全线程取钱
    JUC Lock实现类ReentrantLock使用说明
    同步方法跟同步方法块 synchronized
    线程的管程法跟信号灯法_生产者消费模式
    CopyOnWriteArrayList JUC当中安全容器
    inserttextatcursorinacontenteditablediv
    Android开发——NDK开发入门
    Linux下线程同步对象(1)——互斥量
  • 原文地址:https://www.cnblogs.com/blsz/p/11530380.html
Copyright © 2020-2023  润新知