2015-11-20 8 views
17

Ho un webview per caricare URL, ma non funziona.Errore Android in webview.loadUrl() - Ancora sicuro per percorso di certificazione non trovato

Guardate il mio codice:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    WebView wv = (WebView) findViewById(R.id.webView); 

    //Log.d("rudyy", "aqui"); 
    wv.loadUrl("https://tripulanteaims.tam.com.br/wtouch/wtouch.exe/index"); 
    //Log.d("rudyy", "fim"); 


    } 
} 

Quando eseguire questo codice, Android restituisce questo errore:

Failed to validate the certificate chain, error: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 

Help-me per favore.

risposta

37

Creare un WebViewClient:

private class WvClient extends WebViewClient 
{ 
    @Override 
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError er) { 
     handler.proceed(); 
     // Ignore SSL certificate errors 
    } 
} 

e impostare il WebViewClient inizializzato ("WvClient") al tuo WebView ("wv" in questo caso):

wv.setWebViewClient(new WvClient()); 

O in una sola riga:

wv.setWebViewClient(new WebViewClient() {@Override public void onReceivedSslError(WebView v, SslErrorHandler handler, SslError er){ handler.proceed(); }}); 
+1

Voglia gradire ... –

+1

sarà lo stesso con anon '' 'webView.setWebViewClient (nuova WebViewClient() { @Override pubblico onReceivedSslError void (vista WebView, gestore SslErrorHandler, errore SslError) { handler.proceed(); } }); '' ' – tyoc213

+1

esattamente ciò di cui ho bisogno .. – MKY

4

avevo a che fare con questo e francamente permettendo attacchi MITM è un o-no. Ecco una soluzione più pulita che supporta il fissaggio. Salva il certificato nella cartella delle risorse raw.
NOTA: Purtroppo, SSLError ci fornisce un certificato Ssl quando chiami getCertificate(). SslCertificate è una specie di inutile. La sua API pubblica non consente di verificare la chiave pubblica, solo la data di creazione, scaduta, rilasciata a, emessa da. Tuttavia, se apri questa classe vedrai una variabile membro X509Certificate non esposta. IDK perché questa decisione progettuale è stata presa. Ma c'è un'API per ottenere il pacchetto e quella variabile membro del certificato X509 viene memorizzata lì. Quindi accediamo in questo modo, perché il certificato ha molti più metodi utili su di esso.

@Override 
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { 
    SslCertificate sslCertificateServer = error.getCertificate(); 
    Certificate pinnedCert = getCertificateForRawResource(R.raw.your_cert, mContext); 
    Certificate serverCert = convertSSLCertificateToCertificate(sslCertificateServer); 

    if(pinnedCert.equals(serverCert)) { 
     handler.proceed(); 
    } else { 
     super.onReceivedSslError(view, handler, error); 
    } 
} 

public static Certificate getCertificateForRawResource(int resourceId, Context context) { 
    CertificateFactory cf = null; 
    Certificate ca = null; 
    Resources resources = context.getResources(); 
    InputStream caInput = resources.openRawResource(resourceId); 

    try { 
     cf = CertificateFactory.getInstance("X.509"); 
     ca = cf.generateCertificate(caInput); 
    } catch (CertificateException e) { 
     Log.e(TAG, "exception", e); 
    } finally { 
     try { 
      caInput.close(); 
     } catch (IOException e) { 
      Log.e(TAG, "exception", e); 
     } 
    } 

    return ca; 
} 

public static Certificate convertSSLCertificateToCertificate(SslCertificate sslCertificate) { 
    CertificateFactory cf = null; 
    Certificate certificate = null; 
    Bundle bundle = sslCertificate.saveState(sslCertificate); 
    byte[] bytes = bundle.getByteArray("x509-certificate"); 

    if (bytes != null) { 
     try { 
      CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); 
      Certificate cert = certFactory.generateCertificate(new ByteArrayInputStream(bytes)); 
      certificate = cert; 
     } catch (CertificateException e) { 
      Log.e(TAG, "exception", e); 
     } 
    } 

    return certificate; 
} 
+0

Ciao Ryan ... dobbiamo solo ignorare questi metodi? – RickON

+0

@RickON estende WebViewClient e sì, sovrascrive il metodo onReceivedSslError. –

+0

FYI, Se si utilizza il blocco dei certificati e il certificato che si sta bloccando per essere modificato, l'app si interromperà. Solo qualcosa da considerare ... –

Problemi correlati