Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

जावा 8 पर SQL सर्वर JDBC त्रुटि:ड्राइवर सुरक्षित सॉकेट लेयर (SSL) एन्क्रिप्शन का उपयोग करके SQL सर्वर से सुरक्षित कनेक्शन स्थापित नहीं कर सका

मैंने जावा 8 जेवीएम में एसएसएल लॉगिंग को एक लिनक्स इंस्टेंस पर चालू किया जो समस्या को पुन:उत्पन्न करता है। SSL लॉगिंग को -Djavax.net.debug=ssl:handshake:verbose का उपयोग करके चालू किया जाता है . इससे कुछ उपयोगी जानकारी सामने आई।

समाधान कि हम उत्पादन में उपयोग कर रहे हैं और हमारे लिए काम करने के लिए साबित हुआ है, इस पैरामीटर को JVM पर सेट करना है:

 -Djdk.tls.client.protocols=TLSv1

यदि आप अधिक विवरण चाहते हैं, तो कृपया पढ़ें।

एक सर्वर पर जहां समस्या का पुनरुत्पादन किया जा सकता है (फिर से, केवल 5-10% समय), मैंने निम्नलिखित देखा:

*** ClientHello, TLSv1.2
--- 8<-- SNIP -----
main, WRITE: TLSv1.2 Handshake, length = 195
main, READ: TLSv1.2 Handshake, length = 1130
*** ServerHello, TLSv1.2
--- 8<-- SNIP -----
%% Initialized:  [Session-79, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256]
** TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
--- 8<-- SNIP -----
Algorithm: [SHA1withRSA]
--- 8<-- SNIP -----
*** Diffie-Hellman ServerKeyExchange
--- 8<-- SNIP -----
*** ServerHelloDone
*** ClientKeyExchange, DH
--- 8<-- SNIP -----
main, WRITE: TLSv1.2 Handshake, length = 133
--- 8<-- SNIP -----
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, WRITE: TLSv1.2 Handshake, 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 डेटाबेस सर्वर द्वारा चुना जाता है और इस एक्सचेंज में उपयोग किया जाता है। मैंने देखा है कि, जब कनेक्शन समस्याग्रस्त लिनक्स सेवा से विफल हो जाते हैं, तो TLSv1.2 हमेशा वह स्तर होता है जिसे चुना गया था। हालाँकि, TLSv1.2 का उपयोग करने पर कनेक्शन हमेशा विफल नहीं होते हैं। वे केवल 5-10% बार विफल होते हैं।

अब यहाँ एक सर्वर से एक्सचेंज है जिसमें समस्या नहीं है। बाकी सब बराबर है। यानी, उसी डेटाबेस से कनेक्ट करना, JVM का एक ही संस्करण (जावा 1.8.0_60), वही JDBC ड्राइवर, आदि। ध्यान दें कि, यहां, TLSv1 दोषपूर्ण सर्वर के मामले में TLSv1.2 के बजाय डेटाबेस सर्वर द्वारा चुना जाता है।

*** ClientHello, TLSv1.2
--- 8<-- SNIP -----
main, WRITE: TLSv1.2 Handshake, length = 207
main, READ: TLSv1 Handshake, length = 604
*** ServerHello, TLSv1
--- 8<-- SNIP -----
Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA
--- 8<-- SNIP -----
%% Initialized:  [Session-79, TLS_RSA_WITH_AES_128_CBC_SHA]
** TLS_RSA_WITH_AES_128_CBC_SHA
--- 8<-- SNIP -----
Algorithm: [SHA1withRSA]
--- 8<-- SNIP -----
***
*** ServerHelloDone
*** ClientKeyExchange, RSA PreMasterSecret, TLSv1
--- 8<-- SNIP -----
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, 126, 21 }
***
main, WRITE: TLSv1 Handshake, length = 48
main, READ: TLSv1 Change Cipher Spec, length = 1
main, READ: TLSv1 Handshake, length = 48
*** Finished

इसलिए, जब TLSv1 पर Linux JVM और SQL सर्वर के बीच बातचीत होती है, तो कनेक्शन हमेशा सफल होते हैं। जब TLSv1.2 पर बातचीत होती है, तो हमें छिटपुट कनेक्शन विफलताएं मिलती हैं।

(नोट:Java 7 (1.7.0_51) हमेशा TLSv1 पर बातचीत करता है, यही वजह है कि Java 7 JVM के साथ हमारे लिए समस्या कभी नहीं हुई।)

हमारे पास अभी भी खुले प्रश्न हैं:

  1. ऐसा क्यों है कि 2 अलग-अलग लिनक्स सर्वरों से चलने वाला एक ही जावा 8 जेवीएम हमेशा TLSv1 पर बातचीत करेगा, लेकिन किसी अन्य लिनक्स सर्वर से कनेक्ट होने पर यह हमेशा TLSv1.2 पर बातचीत करता है।
  2. और यह भी कि उस सर्वर पर TLSv1.2 मोल-तोल किए गए कनेक्शन सबसे सफल क्यों हैं, लेकिन सभी नहीं?

अपडेट 6/10/2017: Microsoft की यह पोस्टिंग समस्या और उनके प्रस्तावित समाधान का वर्णन करती है।

संसाधन:

http://www.infoworld.com/article/2849292/operating-systems/more-patch-problems-reported-with-the-ms14-066-kb-2992611-winshock-mess.html

http://www.infoworld.com/article/2849292/operating-systems/more-patch-problems-reported-with-the-ms14-066-kb-2992611-winshock-mess.html

http://blogs.msdn.com/b/jdbcteam/archive/2008/09/09/the-driver-could-not-install-a-secure-connection-to-sql-server-by-using-secure- सॉकेट-लेयर-एसएसएल-एन्क्रिप्शन.एएसपीएक्स

जावा 8, जेसीई असीमित शक्ति नीति और टीएलएस पर एसएसएल हैंडशेक

http://blogs.msdn.com/b/saponsqlserver/archive/2013/05/10/analyzing-jdbc-connection-issues.aspx

https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#descPhase2

https://blogs.oracle.com/java-platform-group/entry/java_8_will_use_tls



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. वितरित लेनदेन शुरू करने में असमर्थ

  2. मैं SQL सर्वर 2005 में कॉलम के रूप में यादृच्छिक संख्या कैसे वापस कर सकता हूं?

  3. यूडीएफ के बिना और सीएलआर के बिना टी-एसक्यूएल में एक स्ट्रिंग से सभी व्हाइटस्पेस वर्णों को ट्रिम करने का एक अच्छा तरीका क्या है?

  4. SQL - सर्वर का IP पता प्राप्त करने के लिए क्वेरी

  5. SQL सर्वर में टेबल-वैल्यूड फंक्शन क्या है?