2012-08-02 8 views
10

पर HTTPS कनेक्शन के साथ अज्ञात प्रोटोकॉल त्रुटि मैं एंड्रॉइड एप्लिकेशन पर HTTPS का उपयोग कर एक आरईएसटी सेवा कॉल कर रहा हूं। मेरे पास पहले से ही इसके लिए कोडिंग कोड है, लेकिन अब मैं एक नए स्थापित सर्वर का उपयोग कर रहा हूं जो आरईएसटी सेवा होस्ट कर रहा हूं, अब मैं कनेक्शन स्थापित नहीं कर सकता।एंड्रॉइड

javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x15b7768: Failure in SSL library, usually a protocol error 
error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:683 0x402e5cc3:0x00000000) 

आवेदन बाकी सेवा के साथ बातचीत करने के लिए अपाचे वर्गों का उपयोग करें:

यहाँ अपवाद नहीं है। मुझे यह त्रुटि तब भी मिलती है जब किसी डमी ट्रस्टमैनेजर का उपयोग किया जाता है जो किसी भी प्रकार का प्रमाणपत्र स्वीकार करता है।

एंड्रॉइड नेविगेटर से आरईएसटी सेवा को कॉल करते समय, कनेक्शन सफलतापूर्वक स्थापित किया गया है और ठीक काम करता है।

एंड्रॉइड फोन एचटीसी से नवीनतम 4.0.3 एंड्रॉइड चला रहा है।

आरईएसटी सेवा एसएसएल समर्थन के साथ कॉन्फ़िगर अपाचे पर एक होस्टेड mod_perl एप्लिकेशन है।

https://github.com/android/platform_external_openssl/blob/ics-mr0/ssl/s23_clnt.c पर ओपनएसएसएल स्रोत कोड ब्राउज़ करना मुझे निम्न स्तर की समस्या के अलावा कोई संकेत नहीं देता है।

इस बारे में कोई सुझाव है कि इसे आगे कैसे डिबग करें?

+0

संभावित डुप्ली: http://stackoverflow.com/questions/6735408/apache-commons-net-ssl-handshake-error-with-android – petey

+0

क्या आपने जांच की है कि उस नए सर्वर में SSL प्रमाणपत्र सही ढंग से स्थापित है? – petey

+1

openssl s_client से भी कनेक्ट करें और देखें कि सर्वर क्या भेज रहा है। –

उत्तर

17

ठीक है मुझे पता चला कि समस्या क्या है।

OpenSSL s_client का उपयोग करने के सुझाव के बाद मुझे यह एहसास हुआ कि मैं कनेक्शन के लिए गलत पोर्ट नंबर का उपयोग करता हूं। नया सर्वर मानक एसएसएल पोर्ट का उपयोग कर रहा है जो कि पहले इस्तेमाल किए जा रहे दूसरे सर्वर के मामले में नहीं था।

चूंकि सर्वर एसएसएल प्रोटोकॉल के अनुसार प्रतिक्रिया नहीं दे रहा था, इसलिए ओपनएसएसएल द्वारा प्रतिक्रिया को डीकोड नहीं किया जा सका और इस प्रकार Unknown Protocol Error

पता है कि कैसे मैं OpenSSL s_client इस्तेमाल किया (अपने खोल में करते हैं) चाहते लोगों के लिए:

$ openssl s_client -connect myhost.example.com:443 -tls1 -servername myhost.example.com 

-servername विकल्प Server Name Indication (SNI) सूचीबद्ध सुनिश्चित करने के लिए अगर वहाँ पर होस्ट कर रहे हैं कई साइटों सर्वर सही प्रमाण पत्र प्रदान करता है सर्वर। एसएनआई एक टीएलएस 1.0 (और ऊपर) विकल्प है, और -tls1_1 और -tls1_2 आमतौर पर भी काम करता है।

फिर एसएसएल कनेक्शन के बारे में एक ट्रक लोड जानकारी खोला गया है।

+0

यह भी देखें [कौन सा सिफर सूट एसएसएल सॉकेट के लिए सक्षम है?] (Http://stackoverflow.com/a/23365536/608639)। जावा के 'एसएसएल सॉकेट फैक्ट्री' में कुछ बुरा, छुपा व्यवहार है; और 'SSLSocketFactoryEx' सुनिश्चित करता है कि प्रोटोकॉल और सिफर स्वीट" स्वीकार्य "हैं (" स्वीकार्य "की आधुनिक परिभाषा के अनुसार)। – jww