Java 7'deki İstemciler için TLS 1.1 ve 1.2'yi Etkinleştirme


50

Java 7, istemciler için TLS 1.1 ve 1.2'yi devre dışı bırakır. Gönderen Java Kriptografi Mimarisi Oracle Sağlayıcıları Belgeleri :

Java SE 7 sürümündeki SunJSSE, TLS 1.1 ve TLS 1.2'yi desteklese de, istemci bağlantıları için hiçbir sürüm varsayılan olarak etkin değildir. Bazı sunucular ileriye doğru uyumluluğu doğru şekilde uygulamaz ve TLS 1.1 veya TLS 1.2 istemcileri ile konuşmayı reddeder. Birlikte çalışabilirlik için SunJSSE, istemci bağlantıları için varsayılan olarak TLS 1.1 veya TLS 1.2'yi etkinleştirmez.

Java'yı her uygulama için değil, sistem genelinde bir ortamda (belki bir yapılandırma dosyası aracılığıyla) protokolleri etkinleştirmekle ilgileniyorum.

TLS 1.1 ve 1.2 sistemini sistem çapında nasıl yönetebilirim ?

Not : POODLE’den beriSSLv3 sistemini idari olarak devre dışı bırakmak istiyorum. (SSLv3 ile ilgili sorunlar POODLE'yi en az 15 yıl öncesine dayandırıyor, ancak Java / Oracle / Developers temel en iyi uygulamalara saygı göstermedi, bu yüzden sizin ve benim gibi kullanıcılar bu karmaşayı temizlemeye kaldılar).


İşte Java versiyonu:

$ /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)

Benim için çalışan tek şey burada açıklandığı gibi varsayılan SSLContext ayarını yapmaktı: stackoverflow.com/questions/39157422/…
shmert

Yanıtlar:


31

-Dhttps.protocols=TLSv1.1,TLSv1.2JVM'yi https bağlantıları sırasında hangi TLS protokolü sürümünün kullanılacağını belirtecek şekilde yapılandıran aşağıdaki özelliği ekleyebilirsiniz .


6
Lütfen bunun ne yaptığını daha fazla açıklayın. Aksi takdirde, bu belirsizdir ve yanlış ellere potansiyel olarak zarar verebilir.
studiohack

1
@Thomasz - Buradaki diğerleriyle aynı fikirdeyim ... Bunu sistem çapında nasıl yönetebilirim? Makinenin yapılandırma dosyasına eklenir mi? Öyleyse, dosya nedir ve nereye eklerim?
jww

3
maybye bu bağlantının yardımı olacaktır: blogs.oracle.com/java-platform-group/entry/… komut satırına param olarak -Dhttps.protocols özelliğini ekleyebilirsiniz: java -jar yourapplication.jar -Dhttps.protocols = TLSv1 .2 veya uygulama (sunucu) yapılandırma dosyalarında bir yerde. Ek param ekleyerek işe yarayıp yaramadığını doğrulayabilirsiniz: -Djavax.net.debug = bundan sonra, uygulama https bağlantısı kurulacak olduğunda, kullanılan protokol sürümü de dahil olmak üzere tüm müzakere bilgilerini yazdıracak
Tomasz Rebizant

Bu param (https.protocols), java sanal makinesini https bağlantısı sırasında kullanılması gereken protokol versiyonunun yapılandırmasıdır.
Tomasz Rebizant 10:15

3
@ TomszRebizant, evet, haklısın. Örneğin, export JAVA_OPTS="-Dhttps.protocols=TLSv1.1,TLSv1.2"Tomcat'in setenv.sh dosyasını eklemek , uygulama sunucusundaki uygulamalardan yapılan tüm SSL bağlantılarında hem TLSv1 hem de TLSv2'yi etkinleştirir.
Zaki

14

Java 1.7'yi varsayarak başlangıç ​​komut dosyasına aşağıdaki gibi bir şey eklemeyi deneyebilirsiniz:

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"

Diğer bazı öneriler: https://blogs.oracle.com/java-platform-group/entry/java_8_will_use_tls


Bu özellik belgelerini bulduğunuzda, "-D deployment.security. {ProtocolName} = Doğru / Yanlış;"
kod

@ runcode, tam olarak emin değil, ancak yukarıda belirtilen oracle.com blogunda bahsedilmiştir
cnst

1
@cnst - Buradaki sorun, her Java yazılımı parçasının geliştiricisine başvurmam ve onlara bunu yapmalarını söylemem. Bu yüzden makinemde bir kez idari olarak bunu yapmak istiyorum.
jww

Benim için işe yaramadı.
Sridhar Sarnobat

9

Mac OS X'te Java 7 için, gidin System Preferences > Javave Java Denetim Masası ayrı bir pencerede açılır. Sonra gidip Advancedsekmesine ve aşağı kaydırarak Advanced Security Settingsbölümü ve kontrol Use TLS 1.1ve Use TLS 1.2onay kutularını.

görüntü tanımını buraya girin


Sağol Spiff. Gösterdiğiniz gibi TLS 1.0 ve üstü için ayarlanmış durumdayım. Ancak, bir tane oluşturduğumda SSLSocket(ve bunun diğer Java programlarında olduğunu varsayarım), TLS 1.0 etkindir (ve TLS 1.1 ve 1.2 kullanılabilir).
jww

3
Bunu sisteminizde de (ilgileniyorsanız) test edebilirsiniz. ProtocolTest.java dosyasını bu hata raporundan indirin ve uygulayın. Derlemek ve yürütmek javac ProtocolTest.java && java ProtocolTestiçin bir terminalde çalıştırın . Etkin Protokoller altında neyin göründüğüne bakın .
jww

2
Bu yalnızca WebStart Müşterileri ve Uygulamaları için çalışır. Java ile çalıştırılabilir uygulama sunucularını etkilemez.
Eckes

8

Kısa süre önce bunu araştırdım ve eklemek istiyorum - bu JDK için işe yaramayacak, deployment.properties sadece Applet'ler ve JRE'de çalışan diğer şeyler ile ilgili.

JDK uygulamaları için (örneğin, LDAP'ye bağlanması gereken bir sunucu), sunucu bir istemcidir, ancak deployment.security'dir. işe yaramazdı.

SSLContext.getInstance ("TLSv1.2") gibi bir kod yazmazsanız değiştirmenin yolu yoktur;


4

Deployment.security'e benziyor. * Ayarlar, Java Uygulamalarında ve masaüstünde çalışan Java Web Start programlarında çalışır. Diğerlerinin burada belirttiği gibi, bunu belirtmek için deployment.properties dosyasını düzenleyebilirsiniz.

Tüm kullanıcılar için aynı deployment.properties dosyasını dağıtmak için bir grup politikasının nasıl kullanılacağını gösteren bir makale: http://www.darkoperator.com/blog/2013/1/12/pushing-security-configuration-for- java-7-update-10-üzeri-gpo.html

Ne yazık ki, doğrudan java.exe veya javaw.exe adlı bir bilgisayardaki tüm java programları için bunu açmanın bir yolu yoktur. Java'yı kullanan her programı bulmalı, java'ya geçirilecek parametreleri değiştireceğiniz yapılandırma dosyasını bulmalı ve değiştirmelisiniz.

Tomcat için Tomcat'ten diğer sunuculara olan bağlantıların TLS 1.1+ kullanması için bunu geçmek zorunda kaldık -Dhttps.protocols=TLSv1.1,TLSv1.2. Linux'ta bu düzenleme bin/catalina.shveya oluşturma yoluyla yapılabilir bin/setenv.sh.

Tomcat'in sunucu tarafında yalnızca TLS 1.2 kullanmasını sağlamak için ne gerektiğini bilmiyorum. Apache HTTP ile önden gidiyoruz.


1

Java 7'ye bağlıysanız -Djdk.tls.client.protocols=TLSv1.1,TLSv1.2, JVM'nin argümanlarına ekleyebilirsiniz .

Bunun birkaç uyarısı olduğunu unutmayın:

Bu eksikliklere rağmen, özellikle protokolün TLS kullanmasıyla ilgilenen ancak HTTPS değil, örneğin LDAPS gibi, bunun yararlı olabileceğini düşünüyorum.

[GÜNCELLEME] Sunucu havuzunu Ubuntu'da çalıştıran şirketimde OpenJDK 7'nin 121 numaralı güncellemesinin bile bunu doğru şekilde uygulamak için yeterli olmadığını fark ettik. Çalışmadan önce 181'i güncellemek için tüm sunucuları güncelledik.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.