2017-08-24 1 views
1

WebView funktioniert gut mit http Anfragen und auch https, wo bekannte vertrauenswürdige Sites wie https://www.online.citibank.co.in/ Aber ich versuche, private Website mit CA von 3rd Party ausgestellt, gibt es leeren Bildschirm. Das Zertifikat wird über die SD-Karte auf dem Telefon installiert und in der Liste vertrauenswürdiger Zertifikate aufgeführt.Android WebView laden https url Ergebnisse in leeren Bildschirm

Wenn ich die gleiche URL mit HttpsURLConnection nach dem Hinzufügen des Zertifikats zu TrustManager versuchte, funktioniert es gut (in der Lage, den Inhalt zu erhalten).

Im Folgenden sind die Code-Snippets für WebView und HttpsURLConnection.

HttpsURLConnection: Dieser Code unten funktioniert und in der Lage, den Inhalt der URL zu bekommen (ich bin nicht in der Lage, die URL zu teilen, wie es von außen nicht zugänglich Welt)

try 
{ 
    SSLContext context = null; 

    CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
    InputStream caInput = getResources().openRawResource(R.raw.mi_net); 
    Certificate ca; 
    try { 
     ca = cf.generateCertificate(caInput); 
    } finally { 
     caInput.close(); 
    } 

    // Create a KeyStore containing our trusted CAs 
    String keyStoreType = KeyStore.getDefaultType(); 
    KeyStore keyStore = KeyStore.getInstance(keyStoreType); 
    keyStore.load(null, null); 
    keyStore.setCertificateEntry("ca", ca); 

    // Create a TrustManager that trusts the CAs in our KeyStore 
    String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); 
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); 
    tmf.init(keyStore); 

    // Create an SSLContext that uses our TrustManager 
    context = SSLContext.getInstance("TLS"); 
    context.init(null, tmf.getTrustManagers(), null); 

    url = new URL(urlStr); 
    HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); 
    con.setSSLSocketFactory(context.getSocketFactory()); 
    con.setInstanceFollowRedirects(true); 

    con.setDoOutput(false); 
    con.setConnectTimeout(1000); 
    String responseMsg = con.getResponseMessage(); 
    response = con.getResponseCode(); 
    is = con.getInputStream(); 
} 

WebView : der Rückruf genannt Ein Problem, onReceivedSslError

{ 
    WebSettings viewSettings = webView.getSettings(); 
    viewSettings.setJavaScriptEnabled(true); 
    viewSettings.setAllowContentAccess(true); 
    viewSettings.setBuiltInZoomControls(false); 
    webView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH); 
    webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 
    webView.loadUrl(sameURL); 

    webView.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onPageStarted(final WebView view, final String url, Bitmap favicon) { 
      Log.d("ann", "onPageStarted"); 

     } 

     @Override 
     public void onPageFinished(final WebView view, String url) { 
      Log.d("ann", "inside onPageFinished"); 
     } 

     @Override 
     public void onReceivedError(WebView view, int errorCode, 
            String description, String failingUrl) { 

      if (!failingUrl.startsWith("mailto:")) { 
       webView.loadUrl("file:///android_asset/html/error.html"); 
      } 

     } 

     @Override 
     public void onReceivedSslError(WebView view, SslErrorHandler handler, 
             SslError error) { 
      super.onReceivedSslError(view, handler, error); 
      Log.d("ann","SSL error"); 

      handler.proceed(); 
     } 

    });} 
} 

helfen Bitte mir mit Vorschlag. WebViewClient-Ausnahme ist I/X509Util: Fehler beim Überprüfen der Zertifikatskette, Fehler: java.security.cert.CertPathValidatorException: Vertrauensanker für Zertifizierungspfad nicht gefunden.

Antwort

0

Für die HttpsUrlConnection erstellen Sie das Zertifikat aus einer Datei und setzen es zur Laufzeit.

Das Webview muss das verwenden, was bereits im System vorhanden ist.

Hier ist eine ähnliche Frage mit einer Vermeidung des Problems vorgeschlagen:

Check in the onReceivedSslError() method of a WebViewClient if a certificate is signed from a specific self-signed CA

+0

@Override public void onReceivedSslError (WebView Ansicht, SslErrorHandler Handler, SslError Fehler) {// super.onReceivedSslError (Ansicht, Handler , Error); Log.d ("Ann", "SSL-Fehler"); handler.proceed(); } nach dem Kommentieren der Superfunktion Dinge begannen für mich zu arbeiten. –

+0

Beachten Sie, dass Sie mit dieser Problemumgehung die Überprüfung des Zertifikats umgehen können. Sie sollten die Logik behandeln, um dies zu überprüfen, indem Sie das Zertifikat, das Sie als Datei einschließen, überprüfen. Ansonsten ist es so, als würde man https nicht benutzen. – Juan

Verwandte Themen