Android Web Görünümü bir HTTPS URL'si yüklemiyor


91
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    
}

WebBView'da bir URL yüklemeye çalıştığımda, yalnızca boş bir ekran gösteriyor. Google.com veya yahoo.com'u yüklersem sorunsuz çalışıyor.


1
Şimdi kontrol ettim çalışıyor. çalışmıyorsa tekrar kontrol edin, sonra bunu kodunuza ekleyin webView.getSettings (). setUseWideViewPort (true); webView.getSettings (). setLoadWithOverviewMode (true);
ilango j

Yanıtlar:


156

Lütfen bu bağlantıyı ziyaret edin:

Bu geçersiz kılma yöntemini WebViewClient uygulamanıza ekleyin. Bunu Android SDK 2.2 (API seviyesi 8) veya üstü ile derlemeniz gerekir. Yöntem, 2.2'den itibaren (API seviyesi 8) genel SDK'da görünür, ancak biz onu 2.1, 1.6 ve 1.5 çalıştıran cihazlarda test ettik ve bu cihazlarda da işe yarıyor (bu nedenle açıkçası, davranış başından beri oradaydı).

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

Bu sana yardım edecek.


3
Tartışmadaki son giriş harika çalıştı. Çok teşekkürler.
Bill Lahti

55
Güvenlik uyarısı : Bunu yapmanın, SSL'ye sahip olma amacını tamamen ortadan kaldırdığını unutmayın.
2014

8
Lütfen bunu yapmayın. Güvenli değil ve Play Store'da buna izin verilmiyor.
Antimon

34
Google şimdi yukarıdaki çözümü uygulayan kişiye e-posta gönderiyor: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
Google Güvenlik uyarısını nasıl çözeceğini bilen biri, evet ise lütfen bana bildirin çünkü ben de bu sorunla karşılaşıyorum.
Pratik Tank

49

Doğru cevaba göre, aşağıda yardımcı olabilecek küçük bir kod örneği verilmiştir.

İlk olarak, WebViewClient'i genişleten ve SSL hatalarını yok sayacak şekilde ayarlanmış bir sınıf oluşturun:

// 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
            }

}

Daha sonra (OnCreate () yönteminde başlatılan) web görünümü nesnenizle, web görünümü istemcisini geçersiz kılma sınıfının bir örneği olacak şekilde ayarlayın:

 mWebView.setWebViewClient(
                new SSLTolerentWebViewClient()
        );

2
bu google güvenlik uyarısını verir: WebViewClient.onReceivedSslError işleyicisinin güvenli olmayan uygulaması. bunu nasıl çözeceğini biliyor musun?
Pratik Tank

2
Google Playstore'da Uygulamayı Unsaif Olarak İşaretledi Bunu SSL olmadan nasıl yapabilirim?
Ajay Pandya

Super yöntemini kullanmayın- super.onReceivedSslError (görünüm, işleyici, hata);
Atul Bhardwaj

41

SSL sertifika doğrulamasını düzgün bir şekilde işlemek ve Google'ın yeni Güvenlik Politikası'na göre başvurunun reddedilmesini önlemek için, sunucu tarafından sunulan sertifika beklentilerinizi karşıladığında SslErrorHandler.proceed () işlevini, aksi takdirde SslErrorHandler.cancel () işlevini çağırmak için kodunuzu değiştirin.

Örneğin, kullanıcının onaylamasını sağlamak için bir uyarı iletişim kutusu ekliyorum ve Google'ın artık uyarı göstermediği görülüyor.

    @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();
}

Bu değişikliklerden sonra uyarı göstermeyecektir.


onReceivedSslError bloğunu uygulamadan kaldırırsam ne olur?
Vivek Sinha

1
@VivekSinha handler.cancel () 'i çağıracaktır; varsayılan olarak.
Anant Şah

1
ancak Google yine de aynı nedeni söyleyerek uygulamamı reddetti. Neden?
Vivek Sinha

@VivekSinha, oyun mağazasında uygulamanın başlatılmasıyla ilgili herhangi bir çözüm buldu mu?
Kesha

2
OnReceivedSslError geri aramasını önerildiği gibi uyguladım. Uygulama daha sonra başarıyla yayınlandı.
Vivek Sinha


11

onReceivedSslError'ı geçersiz kıl ve kaldır

super.onReceivedSslError (görünüm, işleyici, hata)

Ve Google güvenliğini çözmek için:

setDomStorageEnabled (true);

Tam kod:

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);
        }
    });

Çok teşekkür ederim adamım. Super.onReceivedSslError (görünüm, işleyici, hata) kaldırmak benim için çalıştı.
Däñish Shärmà

7

Kod satırınızı kopyalayıp yapıştırın kardeşim, işe yarayacak güven bana :) diye düşünüyorum ssl hatası alıyorsunuz. Override onReceivedSslError yöntemini kullanırsanız ve super it's super yöntemini kaldırın. Sadece handler.proceed () yazın, hata çözülür.

    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());

Teşekkürler. İçinde handler.proceed () Çağrı onReceivedSslErrorGünümün tasarrufu
Tam Huynh

2
Bunu yaparsanız (şimdi Temmuz 2019), google play başvurunuzu reddedecektir.
Alp Altunel

Google Play'de çok fazla uygulamam var, hiçbir uygulama hala reddedilmiyor.
ozanurkan

1
Ocak 2020'yi sözlerle reddedecek
John Ruban Singh

6

SSL url'lerini işlemek için WebViewClient sınıfından onReceivedSslError () yöntemi , Bu bir örnektir:

 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();
            }

        });

Örneğimin tamamını buradan kontrol edebilirsiniz: https://github.com/Jorgesys/Android-WebView-Logging

görüntü açıklamasını buraya girin


6

Google güvenliğini çözmek için şunu yapın:

En üstteki çizgiler:

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

Kod:

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
    }
}

2
Android'de yeniyim. Bunu nereye koymalıyım? :)
Gediminas

5

Yukarıdaki cevapları takip ettim ama yine de benim için çalışmıyor gibi görünüyor, aşağıdaki kod genellikle https istekleri olan ödeme geçitlerini entegre ederken benim için bir numara yaptı:

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=mttee@gmail.com&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();
        }
    }
}

Yukarıdaki kod, web görünümünde bir gönderi isteği yapıyor ve ödeme ağ geçidine yeniden yönlendiriliyor.

Ayar settings.setDomStorageEnabled(true);benim için bir numara yaptı Umarım bu yardımcı olur.


2
Bu çözüm TAMAMEN sertifika doğrulamasını devre dışı bırakarak sizi ortadaki adam saldırılarına açık bırakır. Bu, özellikle ödeme ağ geçitleri için asla yapmamanız gereken bir şeydir.
Dirbaio

Benim için başlangıçta web görünümü içeriği değil, sayfanın arka plan resmini yüklemekti. Sadece ekledikten webview.getSettings.setDomStorageEnabled(true);sonra sihirli bir şekilde çalıştı. Belki web sayfası bir tür HTML 5 API kullanıyor, bu yüzden DomStorage'ı etkinleştirmek benim için çalıştı.
Ishant Sagar

handler.proceed () SSL'yi atlayarak
John Ruban Singh

Encodingutil.getbyte nedir
Akash kumar

2

Önerilen yaklaşım olacak

1. Süper yöntemi çağırmayın (Süper çağrıyı geçersiz kılınan yöntemden kaldırın)

2. Google , herhangi bir hata gelirse SslErrorHandler.cancel () yöntemini çağırmanızı önerir.

3. SSL hatalarını ortaya çıkarmak için Sorma iletişim kutusu

En iyi çözüm nedir? Bu geçersiz kılma yöntemini kaldırın

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

}

Bir çözüm mü istiyorsun yoksa bir çözüm mü öneriyorsun?
dharman

Bu yaklaşımı öneriyorum
John Ruban Singh

@JohnRubanSingh Merhaba John, varlıklardan bir JS dosyası yüklüyorum ve onPageFinished ile yüklendikten sonra JS içinde bir fonksiyon çağırıyorum. Yani, webview.setWebViewClient (yeni ....) kullandığım için onReceivedSslError () 'ın geçersiz kılınması gerekir
Shivam Sharma

Bu kod APK'mi reddediyor. 9 aydan beri bu kod reddiye neden olmuyor ancak aniden r8 reddedilmesiyle karşılaşıyor. switch (error.getPrimaryError ()) {case SslError.SSL_UNTRUSTED: handler.proceed (); kırmak; case SslError.SSL_EXPIRED: case SslError.SSL_IDMISMATCH: case SslError.SSL_NOTYETVALID: case SslError.SSL_DATE_INVALID: case SslError.SSL_INVALID: default: handler.cancel (); kırmak; }
Shivam Sharma

@JohnRubanSingh lütfen bana yardım et. Boşluğa katılabiliriz.
Shivam Sharma

0

Bu iki özelliği ayarlamak benim için çalışmasını sağlamak için yeterliydi ve güvenlik sorunlarına maruz kalmaz:

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

0

Java kodunuzda bu satırı webview.getSettings (). SetDomStorageEnabled (true) kullanın

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

0

APK'yi Google Play Store dışında, örneğin özel olarak kullanmak istemeniz durumunda, aşağıdaki gibi bir çözüm muhtemelen işe yarayacaktır:

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

Ek bir isteğe bağlı güvenlik katmanı eklemek istemeniz durumunda, sertifika sabitlemeden yararlanmayı deneyebilirsiniz . IMHO, bu zor özel veya dahili kullanım için gerekli değildir.

Uygulamayı Google Play Store'da yayınlamayı planlıyorsanız, @Override onReceivedSslError'dan (...) {...} kaçınmalısınız. Özellikle handler.proceed () kullanılır. Handler.proceed () ile çözüm her türlü yerleşik güvenlik mekanizmasını engelleyeceğinden, Google bu kod parçasını bulacak ve uygulamanızı kesinlikle reddedecektir .

Ve tarayıcıların https bağlantınızdan şikayet etmemesi, SSL sertifikasının kendisine hiç güvenildiği anlamına gelmez!

Benim durumumda, SSL sertifika zinciri kırıldı. Bu tür sorunları SSL Denetleyicisi ile veya daha orta düzeyde SSLLabs ile hızlı bir şekilde test edebilirsiniz . Ama lütfen bunun nasıl olabileceğini bana sormayın. Kesinlikle hiçbir fikrim yok.

Her neyse, SSL sertifikasını yeniden yükledikten sonra, " WebView'da her ne olursa olsun güvenilmeyen SSL sertifikası " ile ilgili tüm hatalar sonunda kayboldu. Ayrıca onReceivedSslError (...) için @Override'ı kaldırdım ve handler.proceed () 'den kurtuldum ve işte uygulamam Google Play Store tarafından reddedilmedi (tekrar).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.