2012-07-16 14 views
10

मैं JSSE संदर्भ गाइड पर देख रहा हूँ, मैं एक SSLEngine बनाने के लिए SSLContext का एक उदाहरण प्राप्त करने की आवश्यकता है, इसलिए मैं सुरक्षा को सक्षम करने के Netty के साथ उपयोग कर सकते हैं।SSLContext प्रारंभ

SSLContext का उदाहरण प्राप्त करने के लिए, मैं SSLContext.getInstance() का उपयोग करता हूं। मैं देखता हूं कि विधि कई बार ओवरराइड की गई है, इसलिए मैं प्रोटोकॉल और सुरक्षा प्रदाता का उपयोग करने के लिए चुन सकता हूं।

Here, मैं एल्गोरिदम की सूची देख सकता हूं जिसका उपयोग किया जा सकता है। सुरक्षित संचार सक्षम करने के लिए मुझे किस एल्गोरिदम का उपयोग करना चाहिए?

इसके अलावा, चूंकि उपयोग करने के लिए सुरक्षा प्रदाता को निर्दिष्ट करना संभव है, तो मुझे किस प्रदाता का उपयोग करना चाहिए?

धन्यवाद

उत्तर

3

वहाँ प्रोटोकॉल के लिए कोई डिफ़ॉल्ट है, इसलिए मैं एक नवीनतम अपने JDK द्वारा समर्थित है, का प्रयोग करेंगे जो या तो TLSv1, TLSv1.1 या TLSv1.2: देखें कि कौन से काम करता है, या एक नजर है getSupportedProtocols() पर। डिफ़ॉल्ट सुरक्षा प्रदाता का उपयोग उन सभी एपीआई से बचकर किया जाता है जहां आप इसे निर्दिष्ट करते हैं, या अन्यथा उदा। KeyStore.getDefaultType()

और जब आप अपनी एसएसएलईजीएन प्राप्त करने के लिए आते हैं, तो सुनिश्चित करें कि आप उस विधि का उपयोग करें जो होस्टनाम और पोर्ट लेता है। अन्यथा आपको कोई एसएसएल सत्र साझा नहीं होगा।

+0

हाय EJP, आप 'SSLContext.getDefault()' का उपयोग करके क्या मतलब है? इसके अलावा, डिफ़ॉल्ट मान क्या हैं? –

+0

@MickaelMarrache संपादित देखें। – EJP

21

जैसा कि आप standard names documentation में देख सकते हैं, सभी प्रविष्टियां (SSLv3, TLSv1.0, TLSv1.1, ...) कहते हैं कि वे अन्य संस्करणों का समर्थन कर सकते हैं।

अभ्यास में, ओरेकल जेडीके (और ओपनजेडीके) में, वे सभी करते हैं। यदि आप source code देखते हैं, तो TLS10Context कक्षा का उपयोग टीएलएस, एसएसएल, एसएसएलवी 3 और टीएलएस 10, TLS11Context के लिए किया जाता है, TLSv1.1 और TLS12Context के लिए TLSv1.2 के लिए उपयोग किया जाता है। सभी एसएसएल/टीएलएस के सभी संस्करणों का समर्थन करते हैं, यह डिफ़ॉल्ट रूप से सक्षम है जो भिन्न होता है।

यह किसी अन्य प्रदाता या जेआरई विक्रेता के साथ अलग हो सकता है। आपको निश्चित रूप से उस प्रोटोकॉल संस्करण का समर्थन करने जा रहा है जिसे आप उपयोग करना चाहते हैं।

ध्यान दें कि प्रयुक्त प्रोटोकॉल बाद में SSLSocket.setEnabledProtocols(...) या इसके SSLEngine समकक्ष का उपयोग करने पर निर्धारित किया जाता है।

एक सामान्य नियम के रूप में, आप उच्चतम संस्करण संख्या का उपयोग कर सकते हैं (SSLv3 < TLSv1.0 < TLSv1.1 ...), जो कि पार्टियों के साथ आप किस संवाद के साथ संवाद करना चाहते हैं, इस पर निर्भर हो सकते हैं।


कौन सा प्रोटोकॉल डिफ़ॉल्ट रूप से सक्षम कर रहे हैं ओरेकल JRE का सही संस्करण के आधार पर भिन्न होता है।

जब the source code for sun.security.ssl.SunJSSE in OpenJDK 7u40-b43 को देख, TLS बस TLSv1 के लिए एक उपनाम है (और इसलिए SSL और SSLv3 कर रहे हैं) SSLContext प्रोटोकॉल के मामले में,।

  • सभी समर्थन सभी प्रोटोकॉल: विभिन्न implementations of SSLContextImpl को देखते हुए (जो SSLContextImpl खुद के भीतर कक्षाएं हैं)।
  • डिफ़ॉल्ट रूप से सर्वर पर सभी प्रोटोकॉल सक्षम हैं।
  • क्लाइंट साइड प्रोटोकॉल डिफ़ॉल्ट रूप से सक्षम हो सकते हैं:
    • TLS10Context (प्रोटोकॉल SSL, SSLv3, TLS के लिए इस्तेमाल किया, TLSv1) क्लाइंट पक्ष पर डिफ़ॉल्ट रूप से TLSv1.0 को SSLv3 सक्षम बनाता है।
    • TLS11Context (प्रोटोकॉल TLSv1.1 के लिए इस्तेमाल किया) भी डिफ़ॉल्ट रूप से TLSv1.1 सक्षम बनाता है।
    • TLS12Context (प्रोटोकॉल TLSv1.2 के लिए इस्तेमाल किया) भी डिफ़ॉल्ट रूप से TLSv1.2 सक्षम बनाता है।
  • FIPS सक्षम है, तो एसएसएल समर्थित नहीं है (ताकि डिफ़ॉल्ट रूप से सक्षम नहीं)।

the new jdk.tls.client.protocols सिस्टम प्रॉपर्टी के साथ जावा 8 में यह परिवर्तन।

फिर, जब the source code for sun.security.ssl.SunJSSE in OpenJDK 8u40-b25 को देख, SSLContext प्रोटोकॉल TLSv1, TLSv1.1, और TLS10Context के उपयोग TLSv1.2 भी करते हैं, TLS11Context और TLS12Context, जो जावा में के रूप में ही तर्क का पालन करें 7.

हालांकि, प्रोटोकॉल TLS अब नहीं है उनमें से किसी के लिए aliased। इसके बजाय, यह TLSContext का उपयोग करता है जो jdk.tls.client.protocols सिस्टम गुणों में मानों पर निर्भर करता है। से JSSE Reference guide:

ग्राहक पर विशिष्ट SunJSSE प्रोटोकॉल को सक्षम करने के लिए उन्हें उद्धरण चिह्नों में अल्पविराम से अलग की सूची में निर्दिष्ट; अन्य सभी समर्थित प्रोटोकॉल तब क्लाइंट पर अक्षम कर दिए जाते हैं। उदाहरण के लिए, अगर यह संपत्ति के मूल्य "TLSv1, TLSv1.1" है, तो TLSv1 और TLSv1.1 के लिए क्लाइंट पर डिफ़ॉल्ट प्रोटोकॉल सेटिंग्स क्लाइंट पर, सक्षम होते हैं, जबकि SSLv3, TLSv1.2, और SSLv2Hello पर अक्षम हैं ग्राहक।

यदि यह संपत्ति खाली है, तो सभी प्रोटोकॉल डिफ़ॉल्ट रूप से क्लाइंट और सर्वर दोनों पक्षों पर सक्षम होते हैं।

बेशक

, recent versions of Oracle JRE 8, SSL is also completely disabled by default में (ताकि उन सूचियों से हटा दिया)।

ध्यान दें कि दोनों ही मामलों में (JRE 7 और 8), SSLContext आप बॉक्स से बाहर SSLContext.getDefault() के माध्यम से डिफ़ॉल्ट रूप से मिलता है और अधिक या कम एक SSLContext के बराबर प्रोटोकॉल TLS के साथ प्राप्त की है और डिफ़ॉल्ट truststore मानकों और इतने पर के साथ initialised है ।

+0

आप क्या होता है के मामले में अपने जवाब reword कर सकते हैं जब आप getInstance ("एसएसएल") बनाम getInstance ("टीएलएस") या getInstance ("TLSv1") कहते हैं? प्रत्येक के लिए समर्थित प्रोटोकॉल क्या हैं? प्रत्येक के लिए और प्राथमिकता के किस क्रम में डिफ़ॉल्ट प्रोटोकॉल क्या हैं? इन दस्तावेजों पर जावा दस्तावेज बेहद अस्पष्ट है। उदाहरण के लिए यह कहता है कि "टीएलएसवी 1" चुनने से 1.0, 1.1 और 1.2 उपलब्ध हो सकते हैं। क्या इसका मतलब है कि एसएसएलवी 3 अनुपलब्ध है? यदि आप "टीएलएस" चुनते हैं तो क्या एसएसएलवी 3 अनुपलब्ध है? – KyleM

+1

@ केलीम मैंने कुछ विवरण जोड़े हैं। उच्च संस्करण वाले प्रोटोकॉल का चयन निम्न संस्करण वाले लोगों को अक्षम नहीं करता है (जब तक कि आप इसे स्पष्ट रूप से नहीं करते)। हालांकि, एसएसएल के लिए एक अपवाद है, जिसे हाल ही के संस्करणों में भी सामान्य रूप से अक्षम किया जाता है। – Bruno

+0

@ केलीम आपको वास्तव में प्रति थ्रेड एक प्रश्न होना चाहिए ... और यह उत्तर/धागा 2012 से है – eis

संबंधित मुद्दे