Memahami dukungan enkripsi
Saat menyambungkan ke SQL Server, jika aplikasi meminta enkripsi dan instans SQL Server dikonfigurasi untuk mendukung enkripsi TLS, Driver Microsoft JDBC untuk SQL Server memulai jabat tangan TLS. Jabat tangan memungkinkan server dan klien untuk menegosiasikan enkripsi dan algoritma kriptografi untuk digunakan untuk melindungi data. Setelah jabat tangan TLS selesai, klien dan server dapat mengirim data terenkripsi dengan aman. Selama jabat tangan TLS, server mengirimkan sertifikat kunci publiknya ke klien. Penerbit sertifikat kunci publik dikenal sebagai Otoritas Sertifikat (CA). Klien bertanggung jawab untuk memvalidasi bahwa otoritas sertifikat adalah salah satu kepercayaan klien.
Jika aplikasi tidak meminta enkripsi, Driver Microsoft JDBC untuk SQL Server tidak akan memaksa SQL Server untuk mendukung enkripsi TLS. Jika instans SQL Server tidak dikonfigurasi untuk memaksa enkripsi TLS, koneksi dibuat tanpa enkripsi. Jika instans SQL Server dikonfigurasi untuk memaksa enkripsi TLS, driver akan secara otomatis mengaktifkan enkripsi TLS saat berjalan pada Java Virtual Machine (JVM) yang dikonfigurasi dengan benar, atau koneksi dihentikan dan driver akan menimbulkan kesalahan.
Catatan
Pastikan nilai yang diteruskan ke serverName sama persis dengan Nama Umum (CN) atau nama DNS di Nama Alternatif Subjek (SAN) di sertifikat server agar koneksi TLS berhasil.
Untuk informasi selengkapnya tentang cara mengonfigurasi TLS untuk SQL Server, lihat Mengaktifkan koneksi terenkripsi ke Mesin Database.
Keterangan
Untuk mengizinkan aplikasi menggunakan enkripsi TLS, Driver Microsoft JDBC untuk SQL Server telah memperkenalkan properti koneksi berikut yang dimulai dengan rilis versi 1.2: mengenkripsi, trustServerCertificate, trustStore, trustStorePassword, dan hostNameInCertificate. Untuk mengizinkan driver menggunakan TDS 8.0 dengan enkripsi TLS, server properti koneksiCertificate telah diperkenalkan dimulai dengan rilis versi 11.2. Untuk informasi selengkapnya, lihat Mengatur properti koneksi.
Tabel berikut ini meringkas bagaimana versi Microsoft JDBC Driver for SQL Server berperilaku untuk kemungkinan skenario koneksi TLS. Setiap skenario menggunakan serangkaian properti koneksi TLS yang berbeda. Tabel meliputi:
- kosong: "Properti tidak ada di string koneksi"
- nilai: "Properti ada di string koneksi dan nilainya valid"
- any: "Tidak masalah apakah properti ada di string koneksi atau nilainya valid"
Catatan
Perilaku yang sama berlaku untuk autentikasi pengguna SQL Server dan autentikasi terintegrasi Windows.
Pengaturan properti | Perilaku |
---|---|
encrypt = false atau blank trustServerCertificate = apa pun hostNameInCertificate = apa pun trustStore = apa pun trustStorePassword = apa pun |
Driver tidak akan memaksa server untuk mendukung enkripsi TLS. Jika server memiliki sertifikat yang ditandatangani sendiri, driver memulai pertukaran sertifikat TLS. Sertifikat TLS tidak akan divalidasi dan hanya kredensial (dalam paket masuk) yang dienkripsi. Jika server mengharuskan klien untuk mendukung enkripsi TLS, driver akan memulai pertukaran sertifikat TLS. Sertifikat TLS tidak akan divalidasi, tetapi seluruh komunikasi akan dienkripsi. |
encrypt = true trustServerCertificate = true hostNameInCertificate = apa pun trustStore = apa pun trustStorePassword = apa pun |
Driver meminta untuk menggunakan enkripsi TLS dengan server. Jika server mengharuskan klien untuk mendukung enkripsi TLS atau jika server mendukung enkripsi, driver akan memulai pertukaran sertifikat TLS. Jika properti trustServerCertificate diatur ke "true", driver tidak akan memvalidasi sertifikat TLS. Jika server tidak dikonfigurasi untuk mendukung enkripsi, driver akan menimbulkan kesalahan dan mengakhiri koneksi. |
encrypt = true trustServerCertificate = false atau blank hostNameInCertificate = kosong trustStore = kosong trustStorePassword = kosong |
Driver meminta untuk menggunakan enkripsi TLS dengan server. Jika server mengharuskan klien untuk mendukung enkripsi TLS atau jika server mendukung enkripsi, driver akan memulai pertukaran sertifikat TLS. Driver akan menggunakan properti serverName yang ditentukan pada URL koneksi untuk memvalidasi sertifikat TLS server dan mengandalkan aturan pencarian pabrik manajer kepercayaan untuk menentukan penyimpanan sertifikat mana yang akan digunakan. Jika server tidak dikonfigurasi untuk mendukung enkripsi, driver akan menimbulkan kesalahan dan mengakhiri koneksi. |
encrypt = true trustServerCertificate = false atau blank hostNameInCertificate = nilai trustStore = kosong trustStorePassword = kosong |
Driver meminta untuk menggunakan enkripsi TLS dengan server. Jika server mengharuskan klien untuk mendukung enkripsi TLS atau jika server mendukung enkripsi, driver akan memulai pertukaran sertifikat TLS. Driver akan memvalidasi nilai subjek sertifikat TLS dengan menggunakan nilai yang ditentukan untuk properti hostNameInCertificate . Jika server tidak dikonfigurasi untuk mendukung enkripsi, driver akan menimbulkan kesalahan dan mengakhiri koneksi. |
encrypt = true trustServerCertificate = false atau blank hostNameInCertificate = kosong trustStore = nilai trustStorePassword = nilai |
Driver meminta untuk menggunakan enkripsi TLS dengan server. Jika server mengharuskan klien untuk mendukung enkripsi TLS atau jika server mendukung enkripsi, driver akan memulai pertukaran sertifikat TLS. Driver akan menggunakan nilai properti trustStore untuk menemukan file trustStore sertifikat dan nilai properti trustStorePassword untuk memeriksa integritas file trustStore. Jika server tidak dikonfigurasi untuk mendukung enkripsi, driver akan menimbulkan kesalahan dan mengakhiri koneksi. |
encrypt = true trustServerCertificate = false atau blank hostNameInCertificate = kosong trustStore = kosong trustStorePassword = nilai |
Driver meminta untuk menggunakan enkripsi TLS dengan server. Jika server mengharuskan klien untuk mendukung enkripsi TLS atau jika server mendukung enkripsi, driver akan memulai pertukaran sertifikat TLS. Driver akan menggunakan nilai properti trustStorePassword untuk memeriksa integritas file trustStore default. Jika server tidak dikonfigurasi untuk mendukung enkripsi, driver akan menimbulkan kesalahan dan mengakhiri koneksi. |
encrypt = true trustServerCertificate = false atau blank hostNameInCertificate = kosong trustStore = nilai trustStorePassword = kosong |
Driver meminta untuk menggunakan enkripsi TLS dengan server. Jika server mengharuskan klien untuk mendukung enkripsi TLS atau jika server mendukung enkripsi, driver akan memulai pertukaran sertifikat TLS. Driver akan menggunakan nilai properti trustStore untuk mencari lokasi file trustStore. Jika server tidak dikonfigurasi untuk mendukung enkripsi, driver akan menimbulkan kesalahan dan mengakhiri koneksi. |
encrypt = true trustServerCertificate = false atau blank hostNameInCertificate = nilai trustStore = kosong trustStorePassword = nilai |
Driver meminta untuk menggunakan enkripsi TLS dengan server. Jika server mengharuskan klien untuk mendukung enkripsi TLS atau jika server mendukung enkripsi, driver akan memulai pertukaran sertifikat TLS. Driver akan menggunakan nilai properti trustStorePassword untuk memeriksa integritas file trustStore default. Selain itu, driver akan menggunakan nilai properti hostNameInCertificate untuk memvalidasi sertifikat TLS. Jika server tidak dikonfigurasi untuk mendukung enkripsi, driver akan menimbulkan kesalahan dan mengakhiri koneksi. |
encrypt = true trustServerCertificate = false atau blank hostNameInCertificate = nilai trustStore = nilai trustStorePassword = kosong |
Driver meminta untuk menggunakan enkripsi TLS dengan server. Jika server mengharuskan klien untuk mendukung enkripsi TLS atau jika server mendukung enkripsi, driver akan memulai pertukaran sertifikat TLS. Driver akan menggunakan nilai properti trustStore untuk mencari lokasi file trustStore. Selain itu, driver akan menggunakan nilai properti hostNameInCertificate untuk memvalidasi sertifikat TLS. Jika server tidak dikonfigurasi untuk mendukung enkripsi, driver akan menimbulkan kesalahan dan mengakhiri koneksi. |
encrypt = true trustServerCertificate = false atau blank hostNameInCertificate = nilai trustStore = nilai trustStorePassword = nilai |
Driver meminta untuk menggunakan enkripsi TLS dengan server. Jika server mengharuskan klien untuk mendukung enkripsi TLS atau jika server mendukung enkripsi, driver akan memulai pertukaran sertifikat TLS. Driver akan menggunakan nilai properti trustStore untuk menemukan file trustStore sertifikat dan nilai properti trustStorePassword untuk memeriksa integritas file trustStore. Selain itu, driver akan menggunakan nilai properti hostNameInCertificate untuk memvalidasi sertifikat TLS. Jika server tidak dikonfigurasi untuk mendukung enkripsi, driver akan menimbulkan kesalahan dan mengakhiri koneksi. |
encrypt = strict hostNameInCertificate = nilai trustStore = kosong trustStorePassword = kosong serverCertificate = nilai |
Driver meminta untuk menggunakan enkripsi TDS 8.0 strict TLS dengan server.Driver akan memulai jabat tangan TLS dan pertukaran sertifikat dengan server sebagai tindakan pertama. Pengaturan trustServerCertificate diabaikan dan diperlakukan sebagai false dalam strict mode.Driver akan menggunakan properti hostNameInCertificate atau serverCertificate opsional untuk memvalidasi sertifikat TLS server. Jika server tidak dikonfigurasi untuk mendukung koneksi TDS 8, driver akan menimbulkan kesalahan dan mengakhiri koneksi. |
Jika properti enkripsi diatur ke true, Driver Microsoft JDBC untuk SQL Server menggunakan penyedia keamanan JSSE default JVM untuk menegosiasikan enkripsi TLS dengan SQL Server. Penyedia keamanan default mungkin tidak mendukung semua fitur yang diperlukan untuk menegosiasikan enkripsi TLS dengan sukses. Misalnya, penyedia keamanan default mungkin tidak mendukung ukuran kunci umum RSA yang digunakan dalam sertifikat TLS SQL Server. Dalam hal ini, penyedia keamanan default mungkin menimbulkan kesalahan yang akan menyebabkan driver JDBC mengakhiri koneksi. Untuk mengatasi masalah ini, salah satu opsi berikut dapat digunakan:
- Mengonfigurasi SQL Server dengan sertifikat server yang memiliki kunci umum RSA yang lebih kecil
- Konfigurasikan JVM untuk menggunakan penyedia keamanan JSSE yang berbeda di file properti keamanan "<java-home>/lib/security/java.security"
- Menggunakan JVM yang berbeda
Memvalidasi sertifikat TLS server
Selama jabat tangan TLS, server mengirimkan sertifikat kunci publiknya ke klien. Driver atau klien JDBC harus memvalidasi bahwa sertifikat server dikeluarkan oleh otoritas sertifikat yang dipercaya klien. Driver memerlukan sertifikat server untuk memenuhi kondisi berikut:
- Sertifikat dikeluarkan oleh otoritas sertifikat tepercaya.
- Sertifikat harus dikeluarkan untuk autentikasi server.
- Sertifikat tidak kedaluwarsa.
- Nama Umum (CN) dalam Subjek atau nama DNS di Nama Alternatif Subjek (SAN) sertifikat sama persis dengan nilai serverName yang ditentukan dalam string koneksi atau, jika ditentukan, nilai properti hostNameInCertificate.
- Nama DNS dapat menyertakan karakter kartubebas. Versi sebelumnya 7.2, Driver Microsoft JDBC untuk SQL Server tidak mendukung pencocokan kartubebas. Artinya, abc.com tidak akan cocok dengan *.com tetapi *.com akan cocok *.com. Dengan versi 7.2 dan yang lebih baru, pencocokan kartubebas sertifikat standar didukung.
Untuk penggunaan TDS 8.0 dengan strict
enkripsi, nilai properti serverCertificate menyediakan jalur ke sertifikat server yang akan digunakan untuk validasi sertifikat server. File ini harus menggunakan format file PEM. Sertifikat yang diterima dari server harus sama persis dengan sertifikat ini.