Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Грешка JDBC на SQL Server на Java 8:Драйверът не можа да установи защитена връзка със SQL Server чрез използване на криптиране на Secure Sockets Layer (SSL)

Включих SSL регистрирането в Java 8 JVM на екземпляр на Linux, който възпроизвежда проблема. 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 (Java 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 Server, връзките ВИНАГИ са успешни. Когато се договаря TLSv1.2, получаваме спорадични неуспехи на връзката.

(Забележка:Java 7 (1.7.0_51) винаги договаря TLSv1, поради което проблемът никога не е възникнал при нас с Java 7 JVM.)

Отворените въпроси, които все още имаме, са:

  1. ЗАЩО е, че една и съща Java 8 JVM, изпълнявана от 2 различни сървъра на Linux, винаги ще договаря TLSv1, но когато се свързва от друг Linux сървър, тя винаги договаря 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-establish-a-secure-connection-to-sql-server-by-using-secure- sockets-layer-ssl-encryption.aspx

Java 8, политика за неограничена сила на JCE и SSL ръкостискане през TLS

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. Защо използването на знак за долна черта във филтър LIKE ми дава всички резултати?

  2. Неправилен синтаксис близо до ключовата дума 'with'...предишният израз трябва да бъде завършен с точка и запетая

  3. Как да вмъкна байт[] в колона VARBINARY на SQL сървър

  4. SqlServer:Неуспешно влизане за потребител

  5. Как да разположите приложение с база данни на sql сървър на клиенти