2015-06-23 7 views
10

मैं एक एंड्रॉइड ऐप पर काम कर रहा हूं जिसके लिए क्लाइंट सर्टिफिकेट प्रमाणीकरण (पीकेसीएस 12 फाइलों के साथ) की आवश्यकता है। apache.http.* के सभी बहिष्करण के बाद, हमने अपनी नेटवर्क परत पर रीफैक्टरिंग का एक बहुत बड़ा काम शुरू कर दिया है, और हमने ओकेएचटीपी के साथ प्रतिस्थापन के रूप में जाने का फैसला किया है, और अब तक मुझे यह बहुत पसंद है।अब एंड्रॉइड पर SSLSocketFactory को बहिष्कृत किया गया है, क्लाइंट प्रमाणपत्र प्रमाणीकरण को संभालने का सबसे अच्छा तरीका क्या होगा?

हालांकि, मुझे SSLSocketFactory का उपयोग किए बिना क्लाइंट सर्टिफिकेट ऑथ को संभालने का कोई अन्य तरीका नहीं मिला है, ओकेएचटीपी या उस मामले के लिए और कुछ भी। तो इस विशेष मामले में कार्रवाई का सबसे अच्छा तरीका क्या होगा? क्या इस तरह के प्रमाणीकरण को संभालने के लिए OkHttp के साथ कोई और तरीका है?

+3

'SSLSocketFactory' पदावनत नहीं है, या तो [एंड्रॉयड की वर्तमान शिपिंग संस्करणों] में (http://developer.android.com/reference/javax/net/ssl/SSLSocketFactory.html) या एम में डेवलपर पुनरीक्षण। – CommonsWare

+1

हे भगवान, आप बिल्कुल सही हैं, मुझे कभी एहसास नहीं हुआ कि 2 वर्ग SSLSocketFactory थे! org.apache.http.conn.ssl.SSLSocketFactory को बहिष्कृत किया गया है लेकिन javax.net.ssl.SSLSocketFactory नहीं है! इस ज्ञान के लिए बहुत बहुत धन्यवाद। – TheYann

+1

इसके विपरीत, मुझे एहसास नहीं हुआ था कि HttpClient की अपनी 'SSLSocketFactory' कक्षा थी। :-) – CommonsWare

उत्तर

11

जाहिर है, दो SSLSocketFactory कक्षाएं हैं। HttpClient का अपना एक है, और यह बाकी HttpClient के साथ बहिष्कृत है। हालांकि, हर कोई the more conventional javax.net.ssl edition of SSLSocketFactory का उपयोग करेगा, जिसे बहिष्कृत नहीं किया गया है (धन्यवाद $DEITY)।

21

यदि आप https का उपयोग कर रहे हैं, तो आपको एक वैध प्रमाणपत्र का उपयोग करना होगा। अपने देव मंच के दौरान आपको प्रमाण पत्र पर भरोसा करना है, कैसे? sslSocketFactory(SSLSocketFactory sslSocketFactory) को हटा दिया गया है और इसे sslSocketFactory(SSLSocketFactory sslSocketFactory, X509TrustManager trustManager) द्वारा प्रतिस्थापित किया गया है, तो आपको अपनी ग्रेडल फ़ाइल अपडेट करना होगा नीचे दिए गए कोड का टुकड़ा आपको एक विश्वसनीय ओकेएचटीपी क्लाइंट प्राप्त करने में मदद करेगा जो किसी भी एसएसएल प्रमाण पत्र पर भरोसा करता है।

TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
trustManagerFactory.init((KeyStore) null); 
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); 
if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) { 
    throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers)); 
} 
X509TrustManager trustManager = (X509TrustManager) trustManagers[0]; 
SSLContext sslContext = SSLContext.getInstance("SSL"); 
sslContext.init(null, new TrustManager[] { trustManager }, null); 
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); 
OkHttpClient client = new OkHttpClient.Builder().sslSocketFactory(sslSocketFactory, trustManager); 
+2

धन्यवाद, ट्रस्ट मैनेजर जोड़कर बहिष्कृत चेतावनी को हटा दिया जाता है। – tryp

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

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