Android WebView lädt keine HTTPS-URL

90
public void onCreate(Bundle savedInstance)
{       
    super.onCreate(savedInstance);
    setContentView(R.layout.show_voucher);
    webView=(WebView)findViewById(R.id.webview);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setBuiltInZoomControls(true);
    String url ="https://www.paymeon.com/Vouchers/?v=%C80%8D%B1x%D9%CFqh%FA%84%C35%0A%1F%CE&iv=%25%EE%BEi%F4%DAT%E1"
    //webView.loadUrl(url); // Not Working... Showing blank
    webView.loadUrl("http://www.yahoo.com"); // its working    
}

Wenn ich versuche, eine URL in das WebBView zu laden, wird nur ein leerer Bildschirm angezeigt. Wenn ich Google.com oder yahoo.com lade, funktioniert es einwandfrei.

sumit
quelle
1
Es funktioniert. Ich habe es jetzt überprüft. Überprüfen Sie dies erneut, wenn dies nicht funktioniert. Fügen Sie dies mit Ihrem Code hinzu. webView.getSettings (). setUseWideViewPort (true); webView.getSettings (). setLoadWithOverviewMode (true);
Ilango J

Antworten:

154

Bitte besuchen Sie diesen Link:

Fügen Sie diese überschreibende Methode Ihrer WebViewClient-Implementierung hinzu. Sie müssen es mit Android SDK 2.2 (API Level 8) oder höher kompilieren. Die Methode wird im öffentlichen SDK ab 2.2 (API-Level 8) angezeigt, wir haben sie jedoch auf Geräten mit 2.1, 1.6 und 1.5 getestet und sie funktioniert auch auf diesen Geräten (das Verhalten war also offensichtlich die ganze Zeit vorhanden).

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

das wird dir helfen.

Fargath
quelle
3
Der letzte Eintrag in der Diskussion hat super funktioniert. Vielen Dank.
Bill Lahti
53
Sicherheitswarnung : Beachten Sie, dass dies den Zweck von SSL in erster Linie vollständig zunichte macht.
am
8
Bitte tu das nicht. Es ist unsicher und im Play Store nicht erlaubt.
Antimon
32
Google sendet jetzt E-Mails an jeden, der die oben genannte Lösung implementiert:Your app(s) listed at the end of this email have an unsafe implementation of the WebViewClient.onReceivedSslError handler. Specifically, the implementation ignores all SSL certificate validation errors, making your app vulnerable to man-in-the-middle attacks. Apps with vulnerabilities that expose users to risk of compromise may be considered Dangerous Products in violation of the Content Policy and section 4.4 of the Developer Distribution Agreement.
Gustavo
3
Jeder weiß, wie man die Google-Sicherheitswarnung löst. Wenn ja, lassen Sie es mich bitte wissen, da ich auch mit diesem Problem konfrontiert bin.
Pratik Tank
48

Im Folgenden finden Sie ein kleines Codebeispiel, das möglicherweise hilfreich ist.

Erstellen Sie zunächst eine Klasse, die WebViewClient erweitert und SSL-Fehler ignoriert:

// SSL Error Tolerant Web View Client
private class SSLTolerentWebViewClient extends WebViewClient {

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

}

Legen Sie dann mit Ihrem Webansichtsobjekt (initiiert in der OnCreate () -Methode) seinen Webansichtsclient als Instanz der Überschreibungsklasse fest:

 mWebView.setWebViewClient(
                new SSLTolerentWebViewClient()
        );
Robnick
quelle
2
Dies gibt die Google-Sicherheitswarnung: Unsichere Implementierung des WebViewClient.onReceivedSslError-Handlers. Weißt du, wie man das löst?
Pratik Tank
2
Google hat die App im Playstore als Unsaif markiert. Wie geht das ohne SSL?
Ajay Pandya
Verwenden Sie nicht die Super-Methode super.onReceivedSslError (Ansicht, Handler, Fehler).
Atul Bhardwaj
40

Ändern Sie Ihren Code so, dass SslErrorHandler.proceed () immer dann aufgerufen wird, wenn das vom Server vorgelegte Zertifikat Ihren Erwartungen entspricht, und rufen Sie ansonsten SslErrorHandler.cancel () auf, um die Überprüfung von SSL-Zertifikaten ordnungsgemäß zu handhaben und die Ablehnung von Anwendungen durch Google gemäß der neuen Sicherheitsrichtlinie zu vermeiden.

Zum Beispiel füge ich einen Warndialog hinzu, um den Nutzer bestätigen zu lassen, und Google zeigt anscheinend keine Warnung mehr an.

    @Override
    public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    String message = "SSL 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?";

        builder.setTitle("SSL Certificate Error");
        builder.setMessage(message);
    builder.setPositiveButton("continue", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            handler.proceed();
        }
    });
    builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            handler.cancel();
        }
    });
    final AlertDialog dialog = builder.create();
    dialog.show();
}

Nach diesen Änderungen wird keine Warnung angezeigt.

Anant Shah
quelle
Was passiert, wenn ich den Block onReceivedSslError aus der Implementierung entfernt habe?
Vivek Sinha
1
@VivekSinha ruft handler.cancel () auf; standardmäßig.
Anant Shah
1
Google lehnte meine App jedoch aus demselben Grund ab. Warum?
Vivek Sinha
@VivekSinha hat eine Lösung für den App-Start im Play Store gefunden?
Kesha
2
Ich habe den onReceivedSslError-Rückruf wie vorgeschlagen implementiert. App wurde danach erfolgreich veröffentlicht.
Vivek Sinha
11

Entfernen Sie den folgenden Code, es wird funktionieren

 super.onReceivedSslError(view, handler, error);
König der Massen
quelle
Großartig, es hat bei mir funktioniert. Können Sie bitte erklären, wie es funktioniert hat?
Arth Tilva
3
@ArthTilva aus den Google-Dokumenten: "Standardmäßig wird das Laden abgebrochen". Wenn Sie super aufrufen, rufen Sie dieses Standardverhalten auf, bevor es den Rest der Methode erreichen kann. developer.android.com/reference/android/webkit/…
Josh Laird
11

onReceivedSslError überschreiben und entfernen

super.onReceivedSslError (Ansicht, Handler, Fehler)

Und um die Google-Sicherheit zu lösen:

setDomStorageEnabled (true);

Der vollständige Code lautet:

webView.enableJavaScript();
webView.getSettings().setDomStorageEnabled(true); // Add this
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webView.setWebViewClient(new WebViewClient(){
        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            // DO NOT CALL SUPER METHOD
            super.onReceivedSslError(view, handler, error);
        }
    });
FarshidABZ
quelle
Vielen Dank Mann. Das Entfernen von super.onReceivedSslError (Ansicht, Handler, Fehler) hat bei mir funktioniert.
Däñish Shärmà
7

Kopiere und füge deine Codezeile ein, Bruder, es wird funktionieren, vertrau mir :) Ich denke, du bekommst einen SSL-Fehler. Wenn Sie die Methode override onReceivedSslError verwenden und super entfernen, ist dies eine super Methode. Schreiben Sie einfach handler.proceed (), der Fehler wird behoben.

    webView.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress) {

            activity.setTitle("Loading...");
            activity.setProgress(progress * 100);

            if (progress == 100)
                activity.setTitle(getResources().getString(R.string.app_name));
        }
    });

    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            Log.d("Failure Url :" , failingUrl);
        }

        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            Log.d("Ssl Error:",handler.toString() + "error:" +  error);
            handler.proceed();
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    });
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setLoadWithOverviewMode(true);
    webView.getSettings().setUseWideViewPort(true);
    webView.getSettings().setDomStorageEnabled(true);
    webView.loadUrl(Constant.VIRTUALPOS_URL + "token=" + Preference.getInstance(getContext()).getToken() + "&dealer=" + Preference.getInstance(getContext()).getDealerCode());
Ozanurkan
quelle
Vielen Dank. Rufen Sie handler.proceed () in onReceivedSslErrorretten meinen Tag
Tam Huynh
2
Wenn Sie dies tun (jetzt Juli 2019), lehnt Google Play Ihre Bewerbung ab.
Alp Altunel
İ habe zu viele Anwendungen auf Google Play, nichts App wird noch abgelehnt.
Ozanurkan
1
wird Januar 2020 auf Worte ablehnen
John Ruban Singh
6

Um SSL-URLs zu verarbeiten, verwenden Sie die Methode onReceivedSslError () aus der WebViewClient-Klasse. Dies ist ein Beispiel:

 webview.setWebViewClient(new WebViewClient() {
              ...
              ...
              ...

            @Override
            public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
                String message = "SSL 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 += "\"SSL Certificate Error\" Do you want to continue anyway?.. YES";

                handler.proceed();
            }

        });

Sie können mein vollständiges Beispiel hier überprüfen: https://github.com/Jorgesys/Android-WebView-Logging

Geben Sie hier die Bildbeschreibung ein

Jorgesys
quelle
6

Gehen Sie folgendermaßen vor, um die Google-Sicherheit zu lösen:

Linien nach oben:

import android.webkit.SslErrorHandler;
import android.net.http.SslError;

Code:

class SSLTolerentWebViewClient extends WebViewClient {
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        if (error.toString() == "piglet")
            handler.cancel();
        else
            handler.proceed(); // Ignore SSL certificate errors
    }
}
Ronen
quelle
2
Ich bin neu in Android. Wo soll ich das hinstellen? :)
Gediminas
5

Ich habe die obigen Antworten befolgt, aber es scheint immer noch nicht für mich zu funktionieren. Der folgende Code hat mir bei der Integration von Zahlungsgatways, bei denen es sich normalerweise um https-Anfragen handelt, einen Trick getan:

public class MainActivity extends Activity {

    WebView webView;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView = (WebView) findViewById(R.id.webView1);
        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setDomStorageEnabled(true);
        webView.setWebViewClient(new MyWebViewClient());
        String postData = "amount=1000&firstname=mtetno&[email protected]&phone=2145635784&productinfo=android&surl=success.php"
                + "&furl=failure.php&lastname=qwerty&curl=dsdsd.com&address1=dsdsds&address2=dfdfd&city=dsdsds&state=dfdfdfd&"
                + "country=fdfdf&zipcode=123456&udf1=dsdsds&udf2=fsdfdsf&udf3=jhghjg&udf4=fdfd&udf5=fdfdf&pg=dfdf";
        webView.postUrl(
                "http://host/payment.php",
                EncodingUtils.getBytes(postData, "BASE64"));

    }

    private class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            webView.loadUrl(url);
            return true;
        }

        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler,
                SslError error) {
            handler.proceed();
        }
    }
}

Der obige Code führt eine Post-Anfrage in der Webansicht durch und leitet zum Zahlungs-Gateway weiter.

Das Einstellen settings.setDomStorageEnabled(true);hat mir einen Trick getan Ich hoffe, das hilft.

KOTIOS
quelle
2
Diese Lösung deaktiviert die Zertifikatsüberprüfung VOLLSTÄNDIG und lässt Sie für Man-in-the-Middle-Angriffe offen. Dies sollten Sie niemals tun, INSBESONDERE für Zahlungsgateways.
Dirbaio
Für mich lud die Webansicht zunächst nicht den Inhalt, sondern nur das Hintergrundbild der Seite. Nachdem ich es gerade hinzugefügt habe, hat webview.getSettings.setDomStorageEnabled(true);es magisch funktioniert. Möglicherweise verwendet die Webseite eine Art HTML 5-API, sodass die Aktivierung von DomStorage für mich funktioniert hat.
Ishant Sagar
handler.proceed () SSL umgehen
John Ruban Singh
Was ist Encodingutil.getbyte
Akash Kumar
2

Empfohlener Ansatz wird sein

1. Super- Methode nicht aufrufen (Super-Aufruf aus überschriebener Methode entfernen)

2. Google empfiehlt, die Methode SslErrorHandler.cancel () aufzurufen , wenn ein Fehler auftritt

3. Dialogfeld "Nicht auffordern" , um SSL-Fehler anzuzeigen

Was ist die beste Lösung? Entfernen Sie diese Überschreibungsmethode

@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler,SslError error) {

}
John Ruban Singh
quelle
Fragen Sie nach einer Lösung oder schlagen Sie eine vor?
Dharman
Ich schlage diesen Ansatz vor
John Ruban Singh
@JohnRubanSingh Hallo John, ich habe eine JS-Datei aus Assets geladen und sobald eine Datei mit onPageFinished geladen wurde, rufe ich eine Funktion in JS auf. Das Überschreiben von onReceivedSslError () ist also erforderlich, da ich webview.setWebViewClient (neu ....) verwende.
Shivam Sharma
Dieser Code lehnt meine APK ab. Selbst seit 9 Monaten verursacht dieser Code keine Ablehnung, sondern steht jetzt plötzlich vor Ablehnungen r8. switch (error.getPrimaryError ()) {case SslError.SSL_UNTRUSTED: handler.proceed (); brechen; case SslError.SSL_EXPIRED: case SslError.SSL_IDMISMATCH: case SslError.SSL_NOTYETVALID: case SslError.SSL_DATE_INVALID: case SslError.SSL_INVALID: default: handler.cancel; brechen; }
Shivam Sharma
@ JohnRubanSingh bitte hilf mir. Wir können locker mitmachen.
Shivam Sharma
0

Das Festlegen dieser beiden Eigenschaften hat ausgereicht, damit es für mich funktioniert, und ist keinen Sicherheitsproblemen ausgesetzt:

 WebSettings settings = webView.getSettings();
    settings.setJavaScriptEnabled(true);
    settings.setDomStorageEnabled(true);
GreuM
quelle
0

Verwenden Sie diese Zeile webview.getSettings (). SetDomStorageEnabled (true) in Ihrem Java-Code

WebView webView = (WebView) findViewById(R.id.webview);    
webView.getSettings().setDomStorageEnabled(true);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webView.loadUrl(yourUrl);
Abdul Basit Rishi
quelle