2014-07-04 6 views
5

मुझे एंड्रॉइड वेबव्यू के साथ एसएसएल सुरक्षित वेब पेज लोड करने में समस्याएं हैं। onReceivedSslError: primary error: 3 certificate: Issued to: CN=intranet.<company>.de,C=DE,O=<company>,OU=<compay org unit>वेबव्यू और एसएसएल प्रमाणपत्र

मैं पहले से ही सेटिंग्स> सुरक्षा- के माध्यम से Android के कीचेन में इस सर्वर का प्रमाणपत्र श्रृंखला के सभी प्रमाणपत्रों को इंस्टॉल किया> SD कार्ड से इंस्टॉल: मैं हमेशा की तरह त्रुटियों मिलता है। मैं यह भी देख सकता हूं कि स्थापित प्रमाणपत्रों में से एक LogCat से त्रुटि आउटपुट को पूरी तरह से मेल खाता है। यदि मैं डिफ़ॉल्ट ब्राउज़र ऐप का उपयोग करता हूं तो यह और भी अजीब हो जाता है: यह बिना किसी समस्या के पृष्ठ को लोड करता है भले ही मैं पहले बताए गए सभी प्रमाणपत्रों को अनइंस्टॉल कर दूं। मुझे पर handler.proceed() पर कॉल करके सभी प्रमाणपत्रों पर भरोसा किए बिना मैं इसे कैसे ठीक कर सकता हूं, इस पर कोई संकेत नहीं है कि एक संभावित सुरक्षा समस्या है। किसी भी मदद की सराहना की है। धन्यवाद!

चीयर्स जोएर्न

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

+0

यदि आप हमें सहायता करना चाहते हैं, तो आपको किसी अन्य की साइट का उपयोग करने की बजाय वास्तविक जानकारी प्रदान करना चाहिए जैसे कि 'xyz.com' (यह एक असली साइट है)। – jww

+0

क्षमा करें कि मैंने एक वैध होस्ट का उपयोग किया था। दुर्भाग्यवश मैं ग्राहक के बारे में जानकारी का खुलासा नहीं कर सकता हूं और उम्मीद करता हूं कि आप इसे समझ सकते हैं। – bjoernb

उत्तर

2

अच्छी तरह से onReceiveSslError() और handler.proceed() का उपयोग स्वयं हस्ताक्षरित प्रमाणपत्रों के साथ सेवाओं के संबंध में किया जाना चाहिए, वेबव्यू उनके साथ नहीं मिलता है।

मुझे लगता है कि मैं अभी देखता हूं सर्वर साइड एसएसएल कार्यान्वयन है। यदि आपके पास SNI समर्थन के लिए समान प्रमाण जांच के साथ कई सेवाएं हैं और यदि यह अच्छी तरह से कॉन्फ़िगर किया गया है। फिर देखें कि आप जिस सेवा को जोड़ रहे हैं वह सही प्रमाणपत्र लौटाता है या नहीं। अपने सर्वर से विषय वैकल्पिक नाम भी जांचें और इसे अपनी आवश्यकताओं के तहत कॉन्फ़िगर करें।

उस कार्य के लिए आप उन आदेशों का उपयोग कर सकते हैं।

openssl s_client -showcerts -connect yourhost.com:443 

openssl s_client -connect yourhost.com:443 

openssl s_client -servername yourhost.com -connect yourhost.com:443 

openssl s_client -connect yourhost.com:443 | openssl x509 -text 

यहाँ आप Android दस्तावेज़ होस्टनाम सत्यापन के साथ

आम समस्याओं के रूप में इस अनुच्छेद के शुरुआत में उल्लेख किया है से कुछ और जानकारी है, वहाँ एक SSL कनेक्शन की पुष्टि करने के लिए दो प्रमुख हिस्से हैं। पहला यह सत्यापित करना है कि प्रमाणपत्र विश्वसनीय स्रोत से है, जो पिछले खंड का केंद्र था। इस अनुभाग का फ़ोकस दूसरा भाग है: सुनिश्चित करें कि जिस सर्वर से आप पर बात कर रहे हैं, वह सही प्रमाणपत्र प्रस्तुत करता है। (HttpConnection 'example.com' होस्टनाम libcore.net.http.HttpConnection.verifySecureSocketHostname पर सत्यापित नहीं हुआ था:

java.io.IOException: जब ऐसा नहीं होता है, तो आप आम तौर पर एक इस तरह त्रुटि देखेंगे। जावा: 223) libcore.net.http.HttpsURLConnectionImpl $ HttpsEngine.connect (HttpsURLConnectionImpl.java:446) libcore.net.http.HttpEngine.sendSocketRequest (HttpEngine.java990) libcore.net.http पर। HttpEngine.sendRequest (HttpEngine.java:240) libcore.net.http.HttpURLConnectionImpl.getResponse पर (HttpURLConnectionImpl.java:282) libcore.net.http.HttpURLConnectionImpl.getInputStream पर (HttpURLConnectionImpl.java:177) libcore.net.http.HttpsURLConnectionImpl.getInputStream (HttpsURLConnectionImpl.java7271) ऐसा होने का एक कारण सर्वर कॉन्फ़िगरेशन त्रुटि के कारण है। सर्वर एक प्रमाणपत्र के साथ कॉन्फ़िगर किया गया है जिसमें कोई विषय या विषय वैकल्पिक नाम फ़ील्ड्स नहीं है जो सर्वर से मेल खाते हैं पहुंचने का प्रयास कर रहे हैं। कई अलग-अलग सर्वरों के साथ एक प्रमाणपत्र का उपयोग करना संभव है। उदाहरण के लिए, google.com प्रमाणपत्र को openssl s_client -connect google.com:443 के साथ देखें। openssl x509 -text आप देख सकते हैं कि एक विषय जो * .google.com का समर्थन करता है लेकिन * .youtube.com, * .android.com, और अन्य के लिए वैकल्पिक नाम भी विषय देता है। त्रुटि तब होती है जब सर्वर नाम आप से कनेक्ट कर रहे हैं, प्रमाण पत्र द्वारा स्वीकार्य रूप से सूचीबद्ध नहीं है।

दुर्भाग्य से यह किसी अन्य कारण के लिए भी हो सकता है: आभासी होस्टिंग। जब HTTP के साथ एक से अधिक होस्ट नाम के लिए एक सर्वर साझा करने, वेब सर्वर HTTP/1.1 अनुरोध जो होस्टनाम ग्राहक की तलाश में है को लक्षित से बता सकते हैं। दुर्भाग्यवश यह जटिल है HTTPS के साथ, क्योंकि सर्वर को यह पता होना चाहिए कि HTTP प्रमाणपत्र को देखने से पहले सर्वर को वापस लौटना है। इस समस्या को, एसएसएल के नए संस्करणों, विशेष रूप से TLSv.1.0 पता और करने के लिए बाद में, समर्थन सर्वर नाम संकेत (SNI) है, जो इतनी उचित प्रमाणपत्र लौटाया जा सकता है एसएसएल क्लाइंट सर्वर करने का इरादा होस्ट नाम निर्दिष्ट करने के लिए अनुमति देता है।

सौभाग्य से, एंड्रॉइड 2.3 के बाद से HttpsURLConnection एसएनआई का समर्थन करता है। दुर्भाग्यवश, अपाचे HTTP क्लाइंट नहीं है, जो कि कारणों में से एक है जिसे हम इसके उपयोग को हतोत्साहित करते हैं। यदि आपको एंड्रॉइड 2.2 (और पुराना) या अपाचे HTTP क्लाइंट का समर्थन करने की आवश्यकता है तो एक वर्कअराउंड एक अद्वितीय पोर्ट पर वैकल्पिक वर्चुअल होस्ट सेट अप करना है ताकि यह अनजान जो सर्वर प्रमाणपत्र लौटाए।

आशा है कि यह मदद करता है।

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