2013-08-14 12 views
5

हम एक ऐप लिख रहे हैं जिसे HTTPS का उपयोग करके कुछ सर्वरों के साथ संवाद करना होगा। इसे एडब्ल्यूएस (एडब्लूएस पुस्तकालयों का उपयोग करके) और टीएलएस 1.2 का उपयोग करने वाली हमारी कुछ आंतरिक सेवाओं के साथ संवाद करने की आवश्यकता है।एचटीपी क्लाइंट एकाधिक टीएलएस प्रोटोकॉल का समर्थन करता है

मैं बदलकर शुरू कर दिया मेरी HttpClient एक TLS 1.2 SSLContext उपयोग करने के लिए:

public static SchemeRegistry buildSchemeRegistry() throws Exception { 
    final SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); 
    sslContext.init(createKeyManager(), createTrustManager(), new SecureRandom()); 
    final SchemeRegistry schemeRegistry = new SchemeRegistry(); 
    schemeRegistry.register(new Scheme("https", 443, new SSLSocketFactory(sslContext))); 
    return schemeRegistry; 
} 

और DefaultHttpClient वस्तु में इस SchemeRegistry (वसंत के माध्यम से) इंजेक्शन लगाने, लेकिन ऐसा लगता है कि मैं एडब्ल्यूएस से त्रुटियों हो और इसलिए मुझे लगता है अगर मैं दो HttpClients वसंत में परिभाषित किया गया है करने के लिए प्रयास

AmazonServiceException: Status Code: 403, AWS Service: AmazonSimpleDB, AWS Request ID: 5d91d65f-7158-91b6-431d-56e1c76a844c, AWS Error Code: InvalidClientTokenId, AWS Error Message: The AWS Access Key Id you provided does not exist in our records. 

, एक: (मैं गलत हो सकता है) कि एडब्ल्यूएस TLS 1.2 का समर्थन नहीं करता (मैं यह संदेश प्राप्त नहीं करता है, तो मैं सिर्फ सामान्य DefaultHttpClient का उपयोग करें) जो टीएलएस 1.2 और एक डिफ़ॉल्ट का उपयोग करता है, मुझे फॉलो मिलता है त्रुटि है, जो मुझे लगता है कारण का मतलब है कि वसंत instantiating और दो HttpClient वस्तुओं autowiring पसंद नहीं करता:

SEVERE: Servlet /my-refsvc threw load() exception 
java.lang.NullPointerException 
at com.company.project.refsvc.base.HttpsClientFactory.<clinit>(BentoHttpsClientFactory.java:25) 
... 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1031) 
at 
... 
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) 

मैं HTTPS उपयोग नहीं किया है जावा में ज्यादा तो तुम तरह लोगों ने मुझे कुछ सलाह दे सकता है कृपया? 1) मैं स्प्रिंग को दो एचटीपी क्लाइंट ऑब्जेक्ट्स को अनुमति देने के लिए कैसे प्राप्त करूंगा और एक के लिए एडब्ल्यूएस सामान बीन्स के लिए वायर्ड किया जाएगा और दूसरा टीएलएस 1.2 सेवाओं 2 तक पहुंचने के लिए अन्य बीन्स के लिए वायर्ड किया जाएगा 2) या यह बदलना संभव है एक HttpClient ऑब्जेक्ट TLS1.2 (SSLContext, या स्कीम रजिस्ट्री या कुछ के माध्यम से) का प्रयास करने में सक्षम होने के लिए सक्षम है और यदि यह विफल हो जाता है तो TLS1.1 या 1.0 का प्रयास करें? 3) यदि दोनों संभव हैं, तो ऐसा करने का 'बेहतर' तरीका क्या होगा?

+0

जब 'का उपयोग कर SSLContext.getInstance आप एक ही त्रुटि मिलती है के लिए इसे सक्षम करने के बारे में (" TLSv1.1 ") एक छोटे से ब्लॉग पोस्ट बनाया' या ' SSLContext.getInstance ("टीएलएस") '? – Bruno

+0

हां, मुझे वही त्रुटि मिलती है। मैं सोच रहा हूं कि यह मेरा क्लाइंट-साइड सर्टिफिकेट है जो टीएलएस संस्करण की बजाय इसे गड़बड़ कर रहा है। – agentgonzo

+0

डिफ़ॉल्ट रूप से 'SSLContext' का उपयोग करने का प्रयास करें ('SSLContext sslContext = SSLContext.getDefault()', पहले से प्रारंभ किया गया है)। अन्यथा, कम अनुकूलन आज़माएं: 'sslContext.init (createKeyManager(), null, null)' को TM और SecureRandom के लिए डिफ़ॉल्ट का उपयोग करना चाहिए। कीमैनगर के लिए कोई डिफ़ॉल्ट नहीं है, इसलिए आपके कीमैनगर कोड में अभी भी कुछ गलत हो सकता है (केवल सर्वर उपयोगी है यदि सर्वर क्लाइंट-प्रमाणपत्र का अनुरोध कर रहा हो)। – Bruno

उत्तर

3

टीएलएस में प्रोटोकॉल के किस संस्करण का उपयोग करने के लिए बातचीत करने के लिए एक अंतर्निर्मित तंत्र है। RFC 5246 (Appendix E) से:

टीएलएस संस्करणों 1.0, 1.1, और 1.2, और SSL 3.0 का बहुत समान हैं, और उपयोग संगत ClientHello संदेशों; इस प्रकार, उन सभी का समर्थन अपेक्षाकृत आसान है। इसी तरह, सर्वर आसानी से क्लाइंट को टीएलएस के भविष्य के संस्करणों का उपयोग करने की कोशिश कर रहे हैं, जब तक क्लाइंटहेल्लो प्रारूप संगत रहता है, और क्लाइंट सर्वर में उपलब्ध उच्चतम प्रोटोकॉल संस्करण का समर्थन करता है।

एक TLS 1.2 ग्राहक जो इस तरह के बड़े सर्वर के साथ बातचीत करना चाहता है एक सामान्य TLS 1.2 ClientHello भेजने के लिए, युक्त होगा {3, 3} (टीएलएस 1.2) ClientHello.client_version में। यदि सर्वर इस संस्करण का समर्थन नहीं करता है, तो यह पुराने संस्करण संख्या वाले सर्वरहेल्लो के साथ प्रतिक्रिया देगा। यदि ग्राहक इस संस्करण का उपयोग करने के लिए सहमत हैं, बातचीत प्रोटोकॉल के लिए उपयुक्त के रूप में आगे बढ़ेगी।

इसके अलावा, बदलते SSLContext.getInstance(...) केवल परिवर्तन जो प्रोटोकॉल डिफ़ॉल्ट द्वारा सक्षम हैं, में संस्करण संख्या। वास्तविक प्रोटोकॉल संस्करणों को सेट करना SSLSocket.setEnabledProtocols(...) के साथ किया जाता है (this question देखें)। मैं आपके द्वारा उपयोग की जा रही शेष पुस्तकालयों के बारे में निश्चित नहीं हूं, लेकिन यह संभव है कि यह कहीं भी सक्षम प्रोटोकॉल सेट करता है। डिफ़ॉल्ट व्यवहार से अलग है

  • क्या आप अपने createKeyManager() में कर रहे हैं:

    कुछ संभावनाएं हैं।यदि सेवा क्लाइंट-प्रमाणपत्र प्रमाणीकरण का उपयोग कर रही है, तो खराब कॉन्फ़िगरेशन निश्चित रूप से 403 त्रुटि का कारण बन जाएगा।

  • (कम संभावना है, मुझे लगता है, लेकिन createKeyManager() और createTrustManager() देखे बिना कहने में मुश्किल है)। शायद आप जिस सर्वर का उपयोग कर रहे हैं वह टीएलएस 1.2 और संस्करण वार्ता तंत्र के साथ संगत नहीं है। वहाँ sun.security.ssl.SSLContextImpl में इस टिप्पणी है:

    SSL/TLS प्रोटोकॉल आगे संगतता और संस्करण रोल-बैक हमले सुरक्षा, तथापि, SSL/TLS सर्वर विक्रेताओं के एक नंबर इन पहलुओं को ठीक से लागू नहीं किया निर्दिष्ट करें, और कुछ वर्तमान एसएसएल/टीएलएस सर्वर किसी टीएलएस 1.1 या बाद के क्लाइंट से बात करने से इंकार कर सकते हैं।

+0

हम क्लाइंट-सर्टिफिकेट प्रमाणीकरण का उपयोग कर रहे हैं, लेकिन मुझे नहीं पता कि क्लाइंट सर्टिफिकेट के साथ एडब्ल्यूएस सर्वर के साथ प्रमाणित करने का प्रयास कर रहे हैं, जब वे किसी की उम्मीद नहीं कर रहे हैं तो त्रुटियां होंगी या नहीं। एडब्ल्यूएस प्रमाणीकरण के लिए एचएमएसी हस्ताक्षर का उपयोग करता है लेकिन उससे अधिक मुझे वास्तव में पता नहीं है। createKeyManager और createTrustManager बस एक .jks फ़ाइल लोड करें और उस से ऑब्जेक्ट्स को वापस लौटें (इस टिप्पणी में कोड पोस्ट नहीं कर सकते) – agentgonzo

+0

@agentgonzo, यदि आप अधिक कोड पोस्ट करना चाहते हैं तो आप अपना प्रश्न संपादित कर सकते हैं। क्या आप एप्लिकेशन (डिफ़ॉल्ट रूप से) कीस्टोर (javax.net.ssl। * गुण) के लिए अन्य सेटिंग्स का उपयोग करने का प्रयास करते हैं? यदि आपको अन्य संदर्भ (टीएलएस और टीएलएसवी 1.1) मिलते हैं तो क्या होता है? – Bruno

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