2015-02-20 9 views
8

Ich habe eine Lösung, wo mein Android WebView zunächst eine https-URL öffnen muss, dann wird es auf eine HTTP-URL umgeleitet (es könnte ein HTTP-POST von der https-Website versuchen). Dies funktioniert nicht, und mein Android-Debug-Protokoll sagt:Android WebView blockiert Umleitung von https zu http

02-20 11: 04: 45.079 8538-8538 /? E/WebViewCallback: Blockierte URL: [blockiert] Die Seite unter 'https://xxx/' wurde über HTTPS geladen, sendet jedoch Daten an einen unsicheren Speicherort unter 'http://yyy': Dieser Inhalt sollte auch über HTTPS gesendet werden.

Gibt es Konfigurationsoptionen im WebView, die dieses Verhalten zulassen?

Weitere Informationen: Es scheint wie eine Verhaltensänderung im Android SDK. Ein vor langer Zeit kompilierter Kunde tut dies ohne Beanstandungen.

Antwort

25

Die standardmäßigen WebView-Einstellungen für den gemischten http/https-Inhalt in Lollipop (API 20) wurden geändert. Weitere Details finden Sie unter https://datatheorem.github.io/android/2014/12/20/webviews-andorid-lollipop/.

https Damit Sie den gemischten Inhalt-Modus müssen die Umleitung http

if (Build.VERSION.SDK_INT >= 21) { 
     webview.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); 
    } 

Hinweis MIXED_CONTENT_ALWAYS_ALLOW dass MIXED_CONTENT_ALWAYS_ALLOW Einstellung aus sicherheitstechnischer Sicht schlecht ist, und wie Sie in Ihrer Antwort beachten Sie, es ist besser, https auf beiden Seiten zu unterstützen.

Aber für diejenigen, die keine Kontrolle über die Websites haben, sollte dies funktionieren.

+0

Lebensretter! Ich danke dir sehr :) – NightFury

3

Sie können den ssl-Fehler ignorieren, indem Sie die onReceivedSslError() -Methode überschreiben.

@Override 
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { 
    handler.proceed(); // Ignore SSL certificate errors 
} 

Ich hoffe, es wird Arbeit für Sie sein.

+0

Danke für deine Antwort. Auch wenn es funktioniert (nicht versucht), scheint es eine schreckliche Idee, alle SSL-Fehler zu deaktivieren. – Kenneth

+2

Ja, du hast Recht. Dies ist so völlig vereitelt den Zweck von SSL. Ich finde keinen besseren Weg als oben. Prüfen Sie . (https://code.google.com/p/android/issues/detail?id=2388#c15) –

+0

Beachten Sie, dass Google Ihnen nicht gestattet, Ihre App mit diesem Code zu veröffentlichen – joao2fast4u

0

Aus meiner Forschung glaube ich nicht, dass es möglich ist, diese Funktion zu deaktivieren. Ich werde stattdessen https in beiden Seiten unterstützen. Sicher sowieso.

0

Seine arbeitete für mich

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.webView.getContext()); 
    AlertDialog alertDialog = builder.create(); 
    String message = "Certificate error."; 
    switch (error.getPrimaryError()) { 
    case SslError.SSL_UNTRUSTED: 
     message = "The certificate authority is not trusted."; 
     break; 
    case SslError.SSL_EXPIRED: 
     message = "The certificate has expired."; 
     break; 
    case SslError.SSL_IDMISMATCH: 
     message = "The certificate Hostname mismatch."; 
     break; 
    case SslError.SSL_NOTYETVALID: 
     message = "The certificate is not yet valid."; 
     break; 
    } 
    message += " Do you want to continue anyway?"; 
    alertDialog.setTitle("SSL Certificate Error"); 
    alertDialog.setMessage(message); 
    alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() { 

    public void onClick(DialogInterface dialog, int which) { 
     Log.d("CHECK", "Button ok pressed"); 
     // Ignore SSL certificate errors 
     handler.proceed(); 
    } 
    }); 
    alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() { 

    public void onClick(DialogInterface dialog, int which) { 
     Log.d("CHECK", "Button cancel pressed"); 
     handler.cancel(); 
    } 
    }); 
    alertDialog.show(); 
Verwandte Themen