Aktifkan TLS 1.1 dan 1.2 untuk Klien di Java 7

50

Java 7 menonaktifkan TLS 1.1 dan 1.2 untuk klien. Dari Java Cryptography Architecture, Oracle Penyedia Dokumentasi :

Meskipun SunJSSE dalam rilis Java SE 7 mendukung TLS 1.1 dan TLS 1.2, tidak ada versi yang diaktifkan secara default untuk koneksi klien. Beberapa server tidak menerapkan kompatibilitas maju dengan benar dan menolak untuk berbicara dengan klien TLS 1.1 atau TLS 1.2. Untuk interoperabilitas, SunJSSE tidak mengaktifkan TLS 1.1 atau TLS 1.2 secara default untuk koneksi klien.

Saya tertarik untuk mengaktifkan protokol pada pengaturan sistem yang luas (mungkin melalui file konfigurasi), dan bukan solusi per aplikasi Java.

Bagaimana saya secara administratif mengaktifkan TLS 1.1 dan 1.2 sistem yang luas ?

Catatan : sejak POODLE, saya ingin secara administratif menonaktifkan lebar sistem SSLv3. (Masalah dengan SSLv3 mendahului POODLE setidaknya 15 tahun, tetapi Java / Oracle / Developers tidak menghargai praktik terbaik dasar, sehingga pengguna seperti Anda dan saya dibiarkan membersihkan kekacauan).


Ini versi Java:

$ /Library/Java/JavaVirtualMachines/jdk1.7.0_07.jdk/Contents/Home/bin/java -version
java version "1.7.0_07"
Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
Java HotSpot(TM) 64-Bit Server VM (build 23.3-b01, mixed mode)
jww
sumber
Satu-satunya hal yang berhasil bagi saya adalah menetapkan SSLContext default seperti yang dijelaskan di sini: stackoverflow.com/questions/39157422/…
shmert

Jawaban:

31

Anda bisa menambahkan properti berikut -Dhttps.protocols=TLSv1.1,TLSv1.2yang mengkonfigurasi JVM untuk menentukan versi protokol TLS mana yang harus digunakan selama koneksi https.

Tomasz Rebizant
sumber
6
Tolong jelaskan lebih banyak tentang apa yang dilakukannya. Kalau tidak, ini tidak jelas dan berpotensi merusak di tangan yang salah.
studiohack
1
@ Thomasz - Saya agak setuju dengan yang lain di sini ... Bagaimana saya melakukannya secara administratif berdasarkan sistem? Apakah itu ditambahkan ke file konfigurasi mesin? Jika demikian, apa file itu dan di mana saya menambahkannya?
jww
3
maybye tautan ini akan membantu: blogs.oracle.com/java-platform-group/entry/... Anda dapat menambahkan properti -Dhttps.protocols sebagai param di contoh baris perintah: java -jar yourapplication.jar -Dhttps.protocols = TLSv1 .2 atau di suatu tempat di file konfigurasi aplikasi (server). Anda dapat memverifikasi apakah itu berfungsi dengan menambahkan param tambahan: -Djavax.net.debug = semua setelah itu, ketika aplikasi akan menegosiasikan koneksi https, itu akan mencetak semua informasi negosiasi, termasuk versi protokol yang telah digunakan
Tomasz Rebizant
Param ini (https.protocols) mengkonfigurasi mesin virtual java versi protokol mana yang harus digunakan selama koneksi https.
Tomasz Rebizant
3
@ ThomaszRiziz, ya, Anda benar. Misalnya, menambahkan export JAVA_OPTS="-Dhttps.protocols=TLSv1.1,TLSv1.2"setenv.sh Tomcat memungkinkan TLSv1 & TLSv2 untuk semua koneksi SSL yang dibuat dari aplikasi di server aplikasi.
Zaki
14

Anda dapat mencoba menambahkan sesuatu seperti berikut ini ke skrip startup Anda, dengan asumsi Java 1.7:

JAVACMD="$JAVACMD -Ddeployment.security.SSLv2Hello=false -Ddeployment.security.SSLv3=false -Ddeployment.security.TLSv1=false -D\ deployment.security.TLSv1.1=true -Ddeployment.security.TLSv1.2=true"

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

cnst
sumber
di mana Anda menemukan dokumentasi properti ini, saya tidak melihat di mana pun mereka menyebutkan dalam dokumen JAVA7 untuk "-D deployment.security. {ProtocolName} = Benar / Salah;"
runcode
@runcode, tidak terlalu yakin, tetapi disebutkan di blog oracle.com yang dirujuk di atas
cnst
1
@ cnst - masalahnya di sini adalah saya harus menghubungi setiap pengembang dari setiap perangkat lunak Java, dan memberi tahu mereka untuk melakukan ini. Karenanya alasan saya ingin melakukannya secara administratif pada mesin saya.
jww
Tidak bekerja untuk saya.
Sridhar Sarnobat
9

Untuk Java 7 pada Mac OS X, Anda pergi ke System Preferences > Java, dan Java Control Panel terbuka di jendela terpisah. Kemudian Anda pergi ke Advancedtab dan gulir ke bawah ke Advanced Security Settingsbagian dan memeriksa Use TLS 1.1dan Use TLS 1.2centang.

masukkan deskripsi gambar di sini

Spiff
sumber
Spiff terima kasih. Saya sudah menyiapkan TLS 1.0 dan yang lebih tinggi seperti yang Anda tunjukkan. Namun, ketika saya membuat SSLSocket(dan saya menganggap ini terjadi pada program Java lainnya), TLS 1.0 diaktifkan (dan TLS 1.1 dan 1.2 tersedia).
jww
3
Anda dapat menguji ini di sistem Anda juga (jika tertarik). Unduh ProtocolTest.java dari laporan bug ini dan jalankan. Untuk mengkompilasi dan mengeksekusi, jalankan javac ProtocolTest.java && java ProtocolTestdi terminal. Lihat apa yang muncul di bawah Protokol yang Diaktifkan .
jww
2
Ini hanya berfungsi untuk Klien dan Applet WebStart. Itu tidak mempengaruhi server aplikasi yang dimulai dengan java executable.
eckes
8

Saya baru saja meneliti ini dan saya ingin menambahkan - ini tidak akan bekerja untuk JDK, deployment.properties hanya relevan dengan Applet dan hal-hal lain yang berjalan di JRE.

untuk aplikasi JDK (server yang perlu terhubung ke LDAP misalnya) server adalah klien tetapi deployment.security. tidak akan bekerja

tidak ada cara untuk mengubahnya kecuali Anda menulis beberapa kode seperti SSLContext.getInstance ("TLSv1.2");

shlomicthailand
sumber
4

Sepertinya pengaturan deployment.security. * Berfungsi untuk Java Applets dan program Java Web Start yang berjalan di desktop. Seperti yang disebutkan orang lain di sini, Anda dapat mengedit properti deployment.prop untuk menentukan itu.

Berikut ini adalah artikel yang menunjukkan cara menggunakan kebijakan grup untuk menyebarkan file deployment.properties yang sama untuk semua pengguna: http://www.darkoperator.com/blog/2013/1/12/pushing-security-configuration-for- java-7-update-10-via-gpo.html

Sayangnya tidak ada cara untuk mengaktifkannya untuk semua program java di komputer yang secara langsung memanggil java.exe atau javaw.exe. Anda harus menemukan setiap program yang menggunakan java, menemukan file config tempat Anda menentukan parameter untuk diteruskan ke java dan mengubahnya.

Untuk Tomcat kita harus melewati ini sehingga koneksi dari Tomcat ke server lain menggunakan TLS 1.1+: -Dhttps.protocols=TLSv1.1,TLSv1.2. Di Linux ini dapat dilakukan dengan mengedit bin/catalina.shatau dengan membuat bin/setenv.sh.

Saya tidak tahu apa yang diperlukan untuk membuat Tomcat hanya menggunakan TLS 1.2 di sisi server. Kami depan dengan Apache HTTP.

sjbotha
sumber
1

Jika Anda terjebak dengan Java 7, Anda bisa menambah -Djdk.tls.client.protocols=TLSv1.1,TLSv1.2argumen JVM.

Perhatikan bahwa ini memiliki beberapa peringatan:

Terlepas dari kekurangan ini, saya pikir ini bisa bermanfaat, terutama ketika protokol tertarik menggunakan TLS tetapi bukan HTTPS, misalnya LDAPS.

[PEMBARUAN] Di perusahaan saya, yang menjalankan kumpulan servernya di Ubuntu, kami menyadari bahwa bahkan memperbarui 121 dari OpenJDK 7 tidak cukup untuk mengimplementasikannya dengan benar. Kami telah memperbarui semua server untuk memperbarui 181 sebelum berfungsi.

AbVog
sumber