2012-08-29 28 views
7

Quando voglio aprire una connessione HTTPS ottengo l'eccezione SSL. Come impostare HttpURLConnection in modo da non essere sensibile a questa eccezione?Disabilita la convalida del certificato SSL della connessione HTTPS?

Il mio codice è:

private String getData() { 
    String response = null; 
    String connection = "https://www.kamalan.com/"; 

    try { 
     URL url = new URL(connection); 
     Log.i(TAG, "Try to open: " + connection); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

     int responseCode = conn.getResponseCode(); 
     Log.i(TAG, "Response code is: " + responseCode); 
     if (responseCode == HttpURLConnection.HTTP_OK) { 
      BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
      if (in != null) { 
       StringBuilder strBuilder = new StringBuilder();    
       int ch = 0; 
       while ((ch = in.read()) != -1) 
        strBuilder.append((char) ch); 

       // get returned message and show it 
       response = strBuilder.toString(); 
       Log.i("JSON returned by server:", response); 
      } 

      in.close(); 

     } else { 
      Log.e(TAG, "Couldn't open connection in getResepiItems()"); 
     } 
    } catch (SSLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return response; 
} 
+0

Che cosa dice la logcat dice? –

+0

@Morrison Chang Questo è l'errore nel log cat 'Causato da: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: ancora attendibile per il percorso di certificazione non trovato. –

+1

Hai visto questo post SO: http: //stackoverflow.com/questions/6825226/trust-anchor-not-found-for-android-ssl-connection? –

risposta

0

seguire il metodo seguito, funziona per me.

 URL url = new URL("Your URL"); 
     HttpsURLConnection urlConnection =(HttpsURLConnection) url.openConnection(); urlConnection.setSSLSocketFactory(SSLCertificateSocketFactory.getInsecure(0, null)); 
     urlConnection.setHostnameVerifier(getHostnameVerifier()); 
     InputStream is = urlConnection.getInputStream(); 
     OutputStream os = new FileOutputStream(downloadedFile); 
     byte[] data = new byte[1024]; 
     int count; 
     while ((count = is.read(data)) != -1) { 
      os.write(data, 0, count); 
     } 
     os.flush(); 
     os.close(); 
     is.close(); 

Il metodo seguito per impostare il nome host

private HostnameVerifier getHostnameVerifier() { 
     HostnameVerifier hostnameVerifier = new HostnameVerifier() { 
      @Override 
      public boolean verify(String hostname, SSLSession session) { 
       HostnameVerifier hv = 
         HttpsURLConnection.getDefaultHostnameVerifier(); 
       return hv.verify("com.example.com", session); 
      } 
     }; 
     return hostnameVerifier; 
    } 
+0

Funziona come? E perché? Tutte queste sciocchezze equivalgono a nient'altro che a verificare la sessione con un nome host fisso. Il punto, se ce n'è uno, non è indicato. Non utilizzare la formattazione delle quote per il testo che non è quotato, – EJP

Problemi correlati