Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Kesalahan JDBC SQL Server di Java 8:Pengandar tidak dapat membuat sambungan aman ke SQL Server dengan menggunakan enkripsi Secure Sockets Layer (SSL)

Saya mengaktifkan logging SSL di Java 8 JVM pada instance Linux yang mereproduksi masalah. Logging SSL diaktifkan menggunakan -Djavax.net.debug=ssl:handshake:verbose . Ini mengungkapkan beberapa informasi yang berguna.

Solusi yang kami gunakan dalam produksi dan telah terbukti bekerja untuk kami adalah dengan mengatur parameter ini di JVM:

 -Djdk.tls.client.protocols=TLSv1

Jika Anda ingin lebih detail, silakan baca terus.

Di server tempat masalah dapat direproduksi (sekali lagi, hanya 5-10% dari waktu), saya mengamati yang berikut:

*** 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

Perhatikan bahwa TLSv1.2 dipilih oleh server database dan digunakan dalam pertukaran ini. Saya telah mengamati bahwa, ketika koneksi gagal dari layanan linux yang bermasalah, TLSv1.2 SELALU level yang dipilih. Namun, koneksi tidak SELALU gagal saat TLSv1.2 digunakan. Mereka hanya gagal 5-10%.

Sekarang di sini adalah pertukaran dari server yang TIDAK memiliki masalah. Segala sesuatu yang lain adalah sama. Yaitu, menghubungkan ke database yang sama, versi JVM yang sama (Java 1.8.0_60), driver JDBC yang sama, dll. Perhatikan bahwa, di sini, TLSv1 dipilih oleh server database, bukan TLSv1.2 seperti pada kasus server yang rusak.

*** 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

Jadi, ketika TLSv1 dinegosiasikan antara JVM Linux dan SQL Server, koneksi SELALU berhasil. Ketika TLSv1.2 dinegosiasikan, kami mendapatkan kegagalan koneksi sporadis.

(Catatan:Java 7 (1.7.0_51) selalu menegosiasikan TLSv1, itulah sebabnya masalah tidak pernah terjadi pada kami dengan Java 7 JVM.)

Pertanyaan terbuka yang masih kami miliki adalah:

  1. MENGAPA Java 8 JVM yang sama yang dijalankan dari 2 server Linux yang berbeda akan selalu menegosiasikan TLSv1, tetapi ketika terhubung dari server Linux lain selalu menegosiasikan TLSv1.2.
  2. Dan juga mengapa koneksi yang dinegosiasikan TLSv1.2 paling berhasil, tetapi tidak semua, sepanjang waktu di server itu?

Pembaruan 10/6/2017: Postingan dari Microsoft ini menjelaskan masalah dan solusi yang mereka usulkan.

Sumber daya:

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 , Kebijakan Kekuatan Tak Terbatas JCE dan Handshake SSL melalui 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. Menghubungkan SQL Server ke Database Java

  2. Bagaimana cara mendapatkan penanganan kebuntuan Server Sql yang efisien di C # dengan ADO?

  3. Daftar Operator Perbandingan SQL Server

  4. Kueri Pemblokiran SQL Server

  5. Masukkan Data di SQL Server 2017