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
