2012-04-01 11 views
22

क्या मतभेद अगर मैं एक "https" HttpURLConnection और HttpsURLConnection का उपयोग कर कनेक्ट करने का प्रयास कर रहे हैं?एक https से कनेक्ट करने के लिए HttpURLConnection और HttpsURL कनेक्शन का उपयोग करना?

मैं HttpURLConnection और HttpsURLConnection दोनों का उपयोग करके "https" से कनेक्ट करने में सक्षम था इसलिए मैं उलझन में हूं। मैंने सोचा कि मैं केवल एक 'https' से कनेक्शन स्थापित कर सकते हैं अगर मैं HttpsURLConnection?

इस्तेमाल किया नीचे मेरे सवालों में से कुछ हैं:

  • अगर मैं का उपयोग कर एक 'https' से कनेक्शन खोलने में सक्षम था HttpURLConnection, मेरा कनेक्शन अभी भी "https" में है या क्या यह "http" बन गया है?
  • प्रमाणपत्रों की पुष्टि के बारे में कैसे? चूंकि मैंने "012" से कनेक्ट होने पर और HostnameVerifier पर उपयोग करते हुए पर पर कोई SSLSocketFactory और HostnameVerifier नहीं किया था?
  • यह मतलब यह है कि मैं सब कुछ परवाह किए बिना अगर प्रमाणपत्र विश्वसनीय है या नहीं पर भरोसा कर रहा हूँ?

उत्तर

17
  1. HTTPS कनेक्शन का उपयोग किया जा रहा है।
  2. डिफ़ॉल्ट व्यवहार
  3. सुनिश्चित नहीं हैं, लेकिन नीचे पढ़ें।

मैंने अभी कुछ कोड एक परीक्षण के रूप में लिखा है (नीचे सभी तरह देखें)। क्या हो रहा समाप्त होता है URL.openConnection() कॉल तुम वापस दे देंगे एक libcore.net.http.HttpsURLConnectionImpl वर्ग है।

यह HttpsURLConnection के एक कार्यान्वयन है लेकिन HttpsURLConnection HttpURLConnection से विरासत। तो आप काम पर polymorphism देख रहे हैं।

डिबगर ऐसा लगता है कि वर्ग डिफ़ॉल्ट कारखाना तरीकों का उपयोग कर रहा है में आगे देख रहे हैं।

hostnameVerifier = javax.net.ssl.DefaultHostnameVerifier

SSLSocketFactory = org.apache.harmony.xnet.provider.jsse.OpenSSLSocketFactoryImpl

इस यह डिफ़ॉल्ट व्यवहार की तरह दिखता है इस्तेमाल किया जा रहा के आधार पर। मुझे नहीं पता कि इसका मतलब है कि क्या आप सबकुछ पर भरोसा कर रहे हैं लेकिन आप निश्चित रूप से एक HTTPS कनेक्शन स्थापित कर रहे हैं।

कनेक्शन पर प्रलेखन संकेत संकेत उन सीए को स्वतः भरोसा करेंगे जो अच्छी तरह से ज्ञात हैं लेकिन स्वयं हस्ताक्षरित नहीं हैं। (नीचे देखें) मैंने इसका परीक्षण नहीं किया लेकिन उनके पास how to accomplish that here पर उदाहरण कोड है।

एक आवेदन प्रमाणपत्र प्राधिकारी (CA) प्रमाणपत्र प्रणाली का हिस्सा नहीं हैं पर भरोसा करना चाहता है, यह एक SSLSocketFactory HttpsURLConnection पर सेट के माध्यम से अपने खुद X509TrustManager निर्दिष्ट करना चाहिए।

Runnable r = new Runnable() { 

    public void run() { 
     try { 
     URL test = new URL("https://www.google.com/"); 
     HttpURLConnection connection = (HttpURLConnection) test.openConnection(); 
     InputStream is = connection.getInputStream(); 
     StringWriter sw = new StringWriter(); 
     String value = new java.util.Scanner(is).useDelimiter("\\A").next(); 
     Log.w("GOOGLE", value); 
     } catch(Exception e) { 
      Log.e("Test", e.getMessage()); 
     } 
    } 

}; 

Thread t = new Thread(r); 
t.start(); 
+0

धन्यवाद! मैंने आपके कोड का उपयोग कर विभिन्न https वेबसाइटों से कनेक्ट करने का प्रयास किया। SSLSocketFactory का डिफ़ॉल्ट व्यवहार केवल सीए द्वारा हस्ताक्षरित प्रमाण पत्र स्वीकार करना है। मुझे एक sun.security.validator मिला।ValidatorException जब मैंने किसी वेबसाइट से कनेक्ट करने का प्रयास किया जिसका प्रमाणपत्र स्वयं हस्ताक्षरित है। स्पष्टीकरण के लिए धन्यवाद! – Arci

+1

मैं देखता हूं, इसलिए यदि आप जानते हैं कि सर्वर केवल HTTPS URI स्वीकार करता है, तो आप अपने अनुरोध करने के लिए सुरक्षित रूप से 'HttpURLConnection' का उपयोग कर सकते हैं? – Micro

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