जावा 7 पर ग्राहकों के लिए TLS 1.1 और 1.2 सक्षम करें


50

जावा 7 ग्राहकों के लिए टीएलएस 1.1 और 1.2 को निष्क्रिय करता है। से Java Cryptography Architecture ओरेकल प्रदाता प्रलेखन :

हालाँकि, Java SE 7 रिलीज़ में SunJSSE TLS 1.1 और TLS 1.2 का समर्थन करता है, लेकिन क्लाइंट कनेक्शन के लिए डिफ़ॉल्ट रूप से कोई भी संस्करण सक्षम नहीं है। कुछ सर्वर आगे संगतता को सही ढंग से लागू नहीं करते हैं और टीएलएस 1.1 या टीएलएस 1.2 ग्राहकों से बात करने से इनकार करते हैं। इंटरऑपरेबिलिटी के लिए, SunJSSE क्लाइंट कनेक्शन के लिए डिफ़ॉल्ट रूप से टीएलएस 1.1 या टीएलएस 1.2 को सक्षम नहीं करता है।

मैं एक सिस्टम वाइड सेटिंग पर प्रोटोकॉल को सक्षम करने में दिलचस्पी रखता हूं (शायद एक कॉन्फ़िगर फ़ाइल के माध्यम से), और प्रति-जावा-एप्लिकेशन समाधान नहीं।

मैं TLS 1.1 और 1.2 सिस्टम को व्यापक रूप से कैसे सक्षम करूं?

नोट : POODLE के बाद से, मैंSSLv3 सिस्टम को विस्तृत रूप से प्रशासनिक रूप से अक्षम करना चाहूंगा। (SSLv3 के साथ समस्याएँ POODLE को कम से कम 15 साल पहले से बताती हैं, लेकिन जावा / ओरेकल / डेवलपर्स ने बुनियादी सर्वोत्तम प्रथाओं का सम्मान नहीं किया है, इसलिए आप और मेरे जैसे उपयोगकर्ता गंदगी को साफ करने से बचे हैं)।


यहाँ जावा संस्करण है:

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

मेरे लिए काम करने वाली केवल डिफ़ॉल्ट SSLContext को यहाँ वर्णित के रूप में सेट किया गया था: stackoverflow.com/questions/39157422/…
20

जवाबों:


31

आप निम्नलिखित संपत्ति जोड़ सकते हैं -Dhttps.protocols=TLSv1.1,TLSv1.2जो जेवीएम को कॉन्फ़िगर करता है यह निर्दिष्ट करने के लिए कि टीएलएस प्रोटोकॉल संस्करण का उपयोग https कनेक्शन के दौरान कैसे किया जाना चाहिए।


6
कृपया इस बारे में अधिक बताएं कि यह क्या करता है। अन्यथा, यह अस्पष्ट है और गलत हाथों में संभावित रूप से हानिकारक है।
studiohack

1
@Thomasz - मैं यहाँ दूसरों से सहमत हूँ ... मैं इसे प्रशासनिक रूप से व्यापक आधार पर कैसे करूँ? क्या यह किसी मशीन की कॉन्फ़िगरेशन फ़ाइल में जुड़ जाता है? यदि हां, तो फाइल क्या है और मैं इसे कहां जोड़ूं?
jww

3
maybye इस लिंक से मदद मिलेगी: blogs.oracle.com/java-platform-group/entry/… आप कमांड लाइन उदाहरण में एक param के रूप में -https.protocols संपत्ति जोड़ सकते हैं: java -jar .2 या कहीं अनुप्रयोग (सर्वर) कॉन्फ़िगरेशन फ़ाइलों में। आप यह सत्यापित कर सकते हैं कि क्या यह अतिरिक्त परम जोड़कर काम करता है: -Djavax.net.debug = इसके बाद, जब एप्लिकेशन https कनेक्शन से बातचीत करेगा, तो यह प्रोटोकॉल संस्करण सहित सभी बातचीत की जानकारी को प्रिंट करेगा, जिसका उपयोग किया गया है
टॉमस रेजबॉयल

यह परम (https.protocols) जावा वर्चुअल मशीन को कॉन्फ़िगर कर रहा है, जिसे प्रोटोकॉल संस्करण का उपयोग https कनेक्शन के दौरान किया जाना चाहिए।
टॉमस रिबेल्ट

3
@TomaszRebizant, हाँ, आप सही हैं। उदाहरण के लिए, export JAVA_OPTS="-Dhttps.protocols=TLSv1.1,TLSv1.2"Tomcat के setenv.sh में जोड़ना एप्लिकेशन सर्वर पर एप्लिकेशन से किए गए सभी SSL कनेक्शन के लिए TLSv1 और TLSv2 दोनों को सक्षम करता है।
ज़की

14

आप जावा 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"

कुछ अन्य सुझाव: https://blogs.oracle.com/java-platform-group/entry/java_8_will_use_tls


जहाँ आपको ये प्रॉपर्टीज़ के दस्तावेज़ मिले, मुझे JAVA7 डॉक्स में "-D तैनाती .security। {ProtocolName} = True / False;"
रनकोड

@runcode, निश्चित रूप से निश्चित नहीं है, लेकिन यह oracle.com ब्लॉग में उल्लिखित है जो ऊपर संदर्भित है
cnst

1
@cnst - यहां समस्या यह है कि मुझे जावा सॉफ्टवेयर के प्रत्येक टुकड़े के प्रत्येक डेवलपर से संपर्क करने की आवश्यकता है, और उन्हें ऐसा करने के लिए कहें। इसलिए इसका कारण मैं इसे अपनी मशीन पर एक बार प्रशासनिक रूप से करना चाहता हूं।
jww

मेरे लिए काम नहीं किया।
श्रीधर सरनोबत

9

मैक ओएस एक्स पर जावा 7 के लिए, आप जाते हैं System Preferences > Java, और जावा कंट्रोल पैनल एक अलग विंडो में खुलता है। फिर आप Advancedटैब पर जाएं और Advanced Security Settingsअनुभाग पर स्क्रॉल करें Use TLS 1.1और Use TLS 1.2चेकबॉक्स चेक करें।

यहाँ छवि विवरण दर्ज करें


धन्यवाद Spiff। मैंने पहले से ही टीएलएस 1.0 और इसके बाद के संस्करण की स्थापना की है जैसा आपने दिखाया है। हालाँकि, जब मैं एक बनाता हूं SSLSocket(और मुझे लगता है कि यह अन्य जावा कार्यक्रमों के लिए होता है), टीएलएस 1.0 सक्षम है (और टीएलएस 1.1 और 1.2 उपलब्ध है)।
jww

3
आप इसे अपने सिस्टम पर भी टेस्ट कर सकते हैं, (यदि रुचि हो तो)। इस बग रिपोर्ट से ProtocolTest.java डाउनलोड करें और इसे निष्पादित करें। संकलित करने और निष्पादित करने के लिए, एक टर्मिनल में चलाएँ । देखें कि सक्षम प्रोटोकॉल के तहत क्या दिखाता है । javac ProtocolTest.java && java ProtocolTest
jww

2
यह केवल WebStart ग्राहकों और Applets के लिए काम करता है। यह जावा निष्पादन योग्य के साथ शुरू किए गए एप्लिकेशन सर्वर को प्रभावित नहीं करता है।
16

8

मैंने अभी हाल ही में इस पर शोध किया है और मैं जोड़ना चाहता हूं - यह JDK के लिए काम नहीं करेगा, केवल तैनाती Apple और JRE में चल रहे अन्य सामान के लिए प्रासंगिक है।

JDK अनुप्रयोगों के लिए (एक सर्वर जिसे उदाहरण के लिए LDAP से कनेक्ट करने की आवश्यकता होती है) सर्वर एक क्लाइंट है, लेकिन परिनियोजन। सुरक्षा। काम नहीं करेगा।

जब तक आप SSLContext.getInstance ("TLSv1.2") जैसे कुछ कोड नहीं लिखते हैं, इसे बदलने का कोई तरीका नहीं है;


4

यह परिनियोजन.सक्रियता जैसा दिखता है। * सेटिंग्स डेस्कटॉप पर चलने वाले जावा एप्लेट्स और जावा वेब स्टार्ट कार्यक्रमों के लिए काम करती हैं। जैसा कि अन्य लोग यहाँ उल्लेख करते हैं कि आप तैनाती निर्दिष्ट कर सकते हैं।

यहां एक लेख है जो दिखाता है कि सभी उपयोगकर्ताओं के लिए एक ही परिनियोजन.प्राय फ़ाइल दर्ज करने के लिए समूह नीति का उपयोग कैसे करें: http://www.darkoperator.com/blog/2013/1/12/pushing-security-configuration-for- जावा-7-अद्यतन-10-द्वारा-gpo.html

दुर्भाग्यवश कंप्यूटर पर सभी जावा प्रोग्रामों को चालू करने का कोई तरीका नहीं है जो सीधे java.exe या javaw.exe को कॉल करता है। आपको प्रत्येक प्रोग्राम को ढूंढना होगा जो जावा का उपयोग करता है, कॉन्फ़िगरेशन फ़ाइल ढूंढें जहां आप जावा को पारित करने और इसे बदलने के लिए पैरामीटर निर्दिष्ट करते हैं।

टॉम्कट के लिए हमें इसे पास करना था ताकि टॉमकैट से अन्य सर्वरों के कनेक्शन टीएलएस 1.1+ का उपयोग करें -Dhttps.protocols=TLSv1.1,TLSv1.2। लिनक्स पर यह संपादन bin/catalina.shया बनाकर किया जा सकता है bin/setenv.sh

मुझे नहीं पता कि टॉमकैट को सर्वर की तरफ से केवल टीएलएस 1.2 का उपयोग करने के लिए क्या लगता है। हम अपाचे HTTP के साथ सामने हैं।


1

यदि आप जावा 7 के साथ फंस गए हैं, तो आप -Djdk.tls.client.protocols=TLSv1.1,TLSv1.2जेवीएम के तर्कों को जोड़ सकते हैं ।

ध्यान दें कि इसमें कई चेतावनी हैं:

  • यह केवल जावा 7 अपडेट 95 से शुरू होने के लिए वैध है। संदर्भ: https://blogs.oracle.com/java-platform-group/diagnosing-tls,-ssl,-and-https
  • यह एक सिस्टम-वाइड समाधान नहीं है, भले ही इसे एक पर्यावरण चर (उदाहरण के लिए JAVA_OPTS) में सेट किया जा सकता है , जिस स्थिति में आप अपने जावा अनुप्रयोगों में एनवार के समर्थन पर निर्भर हैं।

इन कमियों के बावजूद, मुझे लगता है कि यह उपयोगी हो सकता है, खासकर जब प्रोटोकॉल एक TLS के उपयोग में रुचि रखता है, लेकिन HTTPS, जैसे LDAPS नहीं है।

[अद्यतन] मेरी कंपनी में, जो उबंटू पर अपने सर्वर का पूल चलाता है, हमने महसूस किया है कि ओपनजेडके of१ का १२१ भी इसे सही ढंग से लागू करने के लिए पर्याप्त नहीं था। हमने काम करने से पहले 181 को अपडेट करने के लिए सभी सर्वरों को अपडेट किया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.