2012-08-12 22 views
24

मुझे एक वेबसाइट मिली है कि मैं एक विश्वसनीय सेवा के लिए एसएसएल सक्षम कर रहा हूं। हमने रैपिडएसएसएल के साथ पंजीकृत किया है, कर्ट स्थापित किया है, और यह RapidSSL checker पास करता है। मैं बिना किसी समस्या के, एंड्रॉइड ब्राउज़र (फ़ायरफ़ॉक्स और ओपेरा में निर्मित) सहित विभिन्न ब्राउज़रों के साथ साइट तक पहुंचने में सक्षम हूं, कोई चेतावनी नहीं।एंड्रॉइड एसएसएल: javax.net.ssl.SSLPeerUnverifiedException: कोई सहकर्मी प्रमाणपत्र (अभी तक फिर से)

हालांकि, जब मैं अपने Android एप्लिकेशन के साथ यह तक पहुँचने का प्रयास, मैं निम्न अपवाद प्राप्त करें:

08-11 20:04:05.586 363 381 E HttpProvider: Error executing request: No peer certificate 
08-11 20:04:05.586 363 381 E HttpProvider: javax.net.ssl.SSLPeerUnverifiedException: No peer certificate 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.harmony.xnet.provider.jsse.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:259) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:93) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:381) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:164) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:359) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
08-11 20:04:05.586 363 381 E HttpProvider: at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
08-11 20:04:05.586 363 381 E HttpProvider: at com.xxxxx.netlib.http.HttpProvider.executeRequest(HttpProvider.java:75) 

यह एमुलेटर पर एंड्रॉयड 2.3.3 पर और एक 3.2 टैबलेट पर होता है। मैंने इस पर बहुत सारी हिट देखी हैं, लेकिन मुझे जो कुछ भी मिला है, वह मुझे इस मुद्दे को ठीक करने में मदद नहीं करता है।

अधिक डेटा:

$ openssl s_client -CAfile www.xxxxx.com.pem -connect www.xxxxx.com:443 
CONNECTED(00000003) 
depth=3 C = US, O = Equifax, OU = Equifax Secure Certificate Authority 
verify return:1 
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA 
verify return:1 
depth=1 C = US, O = "GeoTrust, Inc.", CN = RapidSSL CA 
verify return:1 
depth=0 serialNumber = 1-7wArtEjdTwJ94d5iVDooDmmC4mXyVj, OU = GT82425783, OU = See www.rapidssl.com/resources/cps (c)12, OU = Domain Control Validated - RapidSSL(R), CN = www.xxxxx.com 
verify return:1 
--- 
Certificate chain 
0 s:/serialNumber=1-7wArtEjdTwJ94d5iVDooDmmC4mXyVj/OU=GT82425783/OU=See www.rapidssl.com/resources/cps (c)12/OU=Domain Control Validated - RapidSSL(R)/CN=www.xxxxx.com 
    i:/C=US/O=GeoTrust, Inc./CN=RapidSSL CA 
1 s:/C=US/O=GeoTrust, Inc./CN=RapidSSL CA 
    i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA 
2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA 
    i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority 
--- 
[snip] 

कोड मैं ग्राहक स्थापित करने के लिए चल रहा हूँ:

public class HttpProvider implements INetworkProvider { 
    private static final String LOG = "HttpProvider"; 
    protected DefaultHttpClient client; 

    public HttpProvider() { 
    SchemeRegistry registry = new SchemeRegistry(); 
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
    final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory(); 
    sslSocketFactory.setHostnameVerifier(SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); 
    registry.register(new Scheme("https", sslSocketFactory, 443)); 

    client = new DefaultHttpClient(
     new ThreadSafeClientConnManager((new BasicHttpParams()), registry), new BasicHttpParams() 
    ); 
    } 
[snip] 

मैं भी STRICT_HOSTNAME_VERIFIER साथ की कोशिश की है और अभी भी कोई खुशी।

जो मैं समझता हूं उससे मुझे किसी भी कस्टम ट्रस्टस्टोर या कीस्टोर सेट अप करने की आवश्यकता नहीं है क्योंकि मैं एक मान्यता प्राप्त प्रमाण प्रदाता के साथ पंजीकृत हूं।

मैं एसएसएल के साथ बहुत नया हूं और मुझे लगता है कि मैं तीन पत्र शब्दकोष के समुद्र में तैर रहा हूं, और मुझे उम्मीद है कि यहां कोई व्यक्ति मुझे सही दिशा में एक झुकाव दे सकता है।

+0

मुझे पता चला है कि सिस्टम ट्रस्ट स्टोर को कैसे डंप करना है, और मुझे वहां रैपिडएसएसएल दिखाई नहीं दे रहा है, यह कहने के बावजूद कि यह शहद में था। मैं अपना खुद का ट्रस्टस्टोर बनाने की कोशिश करूंगा और देखें कि क्या होता है। – mvsjes2

+0

इसे आज़माएं: https://stackoverflow.com/a/38598593/2301721 (HttpsURLConnection का उपयोग करके) – ashishdhiman2007

उत्तर

18

खोदने और प्रयोग के ढेर के बाद, मुझे अंत में एहसास हुआ कि मैं जिस यूआरएल का उपयोग कर रहा था वह 443 के डिफ़ॉल्ट होने के बजाय हार्ड कोड पोर्ट 80 था। गूंगा गूंगा गूंगा।

इस प्रश्न का उत्तर Trusting all certificates using HttpClient over HTTPS एसएसएल की मेरी समझ के लिए काफी मदद करता है।