server 2008 服务器不能访问 java项目,Java 8上的SQL Server JDBC错误:驱动程序无法使用安全套接字层(SSL)加密建立到SQL Server的安全连接...
我在一個Linux實例上的Java 8 JVM中啟用了SSL記錄,從而再現了這個問題.使用-Djavax.net.debug = ssl:handshake:verbose打開SSL日志記錄.這顯示了一些有用的信息.
我們在生產中使用并已證明可以為我們工作的解決方法是在JVM上設置此參數:
-Djdk.tls.client.protocols=TLSv1
如果你想要更多的細節,請繼續閱讀.
在可以再現問題的服務器上(再次只有5-10%的時間),我觀察到以下情況:
*** ClientHello,TLSv1.2
--- 8
main,WRITE: TLSv1.2 Handshake,length = 195
main,READ: TLSv1.2 Handshake,length = 1130
*** ServerHello,TLSv1.2
--- 8
%% Initialized: [Session-79,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256]
** TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
--- 8
Algorithm: [SHA1withRSA]
--- 8
*** Diffie-Hellman ServerKeyExchange
--- 8
*** ServerHelloDone
*** ClientKeyExchange,DH
--- 8
main,length = 133
--- 8
main,WRITE: TLSv1.2 Change Cipher Spec,length = 1
*** Finished
verify_data: { 108,116,29,115,13,26,154,198,17,125,114,166 }
***
main,length = 40
main,called close()
main,called closeInternal(true)
main,SEND TLSv1.2 ALERT: warning,description = close_notify
main,WRITE: TLSv1.2 Alert,length = 26
main,called closeSocket(true)
main,waiting for close_notify or alert: state 5
main,received EOFException: ignored
main,called closeInternal(false)
main,close invoked again; state = 5
main,handling exception: java.io.IOException: sql Server returned an incomplete response. The connection has been closed. ClientConnectionId:12a722b3-d61d-4ce4-8319-af049a0a4415
請注意,TLSv1.2由數據庫服務器選擇并用于此交換.我觀察到,當有問題的linux服務連接失敗時,TLSv1.2始終是所選的級別.但是,當使用TLSv1.2時,連接不總是失敗.他們只能在5-10%的時間內失敗.
現在這里是一個沒有問題的服務器的交換.一切都是平等的.即,連接到相同的數據庫,相同版本的JVM(Java 1.8.0_60),相同的JDBC驅動程序等.請注意,在這里,TLSv1由數據庫服務器而不是TLSv1.2選擇,如在故障服務器的情況下.
*** ClientHello,length = 207
main,READ: TLSv1 Handshake,length = 604
*** ServerHello,TLSv1
--- 8
Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA
--- 8
%% Initialized: [Session-79,TLS_RSA_WITH_AES_128_CBC_SHA]
** TLS_RSA_WITH_AES_128_CBC_SHA
--- 8
Algorithm: [SHA1withRSA]
--- 8
***
*** ServerHelloDone
*** ClientKeyExchange,RSA PreMasterSecret,TLSv1
--- 8
main,WRITE: TLSv1 Handshake,length = 134
main,WRITE: TLSv1 Change Cipher Spec,length = 1
*** Finished
verify_data: { 26,155,166,89,229,193,126,39,103,206,21 }
***
main,length = 48
main,READ: TLSv1 Change Cipher Spec,length = 1
main,length = 48
*** Finished
因此,當在Linux JVM和sql Server之間協商TLSv1時,連接總是成功的.當協商TLSv1.2時,我們得到零星的連接失敗.
(注意:Java 7(1.7.0_51)總是協商TLSv1,這就是為什么我們使用Java 7 JVM的問題.)
我們還有的開放性問題是:
>為什么從兩個不同的Linux服務器運行的相同的Java 8 JVM將始終協商TLSv1,但是當從另一個Linux服務器連接時,它始終協商TLSv1.2.
>而且為什么TLSv1.2協商連接在該服務器上最成功,但并非全部成功?
資源:
總結
以上是生活随笔為你收集整理的server 2008 服务器不能访问 java项目,Java 8上的SQL Server JDBC错误:驱动程序无法使用安全套接字层(SSL)加密建立到SQL Server的安全连接...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不止首发天玑9000!曝OPPO Fin
- 下一篇: java判断时间区间 隔天_Java初中