Android WebView एक HTTPS URL लोड नहीं कर रहा है


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 में एक URL लोड करने की कोशिश करता हूं तो यह केवल एक खाली स्क्रीन दिखाता है। अगर मैं Google.com या yahoo.com लोड करता हूं तो यह ठीक काम कर रहा है।


1
यह काम कर रहा है मैं अब जाँच की। यदि आपके कोड webView.getSettings ()। setUseWideViewPort (सच) के साथ इसे जोड़ने के बाद काम नहीं कर रहा है तो फिर से जांचें; । webView.getSettings () setLoadWithOverviewMode (सही);
इलंगो जे

जवाबों:


155

कृपया इस लिंक पर जाएँ:

इस ओवरराइडिंग विधि को अपने WebViewClient कार्यान्वयन में जोड़ें। आपको इसे एंड्रॉइड एसडीके 2.2 (एपीआई स्तर 8) या बाद के साथ संकलित करने की आवश्यकता होगी। विधि सार्वजनिक एसडीके में 2.2 (एपीआई स्तर 8) के रूप में दिखाई देती है, लेकिन हमने इसे 2.1, 1.6 और 1.5 पर चलने वाले उपकरणों पर परीक्षण किया है और यह उन उपकरणों पर भी काम करता है (इसलिए जाहिर है कि व्यवहार सभी के साथ रहा है)।

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

यह आपकी मदद करेगा।


3
चर्चा में अंतिम प्रविष्टि ने बहुत अच्छा काम किया। बहुत बहुत धन्यवाद।
बिल लत्ती

54
सुरक्षा चेतावनी : ध्यान दें कि ऐसा करना पूरी तरह से SSL होने के उद्देश्य को पूरी तरह से हरा देता है।
ेरेऑन

8
कृपया ऐसा न करें। यह असुरक्षित है और प्ले स्टोर में इसकी अनुमति नहीं है।
एंटिमोनी

33
Google अब ऊपर के समाधान को लागू करने वाले को ईमेल भेज रहा है: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 सुरक्षा चेतावनी को हल करना जानता है, यदि हाँ तो कृपया मुझे बताएं क्योंकि मैं भी इस समस्या का सामना कर रहा हूं।
प्रतीक्षित टैंक

49

Fargth द्वारा सही उत्तर देने के बाद, निम्न एक छोटा कोड नमूना है जो मदद कर सकता है।

सबसे पहले, एक वर्ग बनाएं जो WebViewClient का विस्तार करता है और जो SSL त्रुटियों को अनदेखा करने के लिए सेट है:

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

}

फिर अपने वेब व्यू ऑब्जेक्ट (ऑनक्रिएट () विधि में आरंभ) के साथ, अपने वेब व्यू क्लाइंट को ओवरराइड क्लास का एक उदाहरण होने के लिए सेट करें:

 mWebView.setWebViewClient(
                new SSLTolerentWebViewClient()
        );

2
यह Google को सुरक्षा चेतावनी देता है: WebViewClient.onReceivedSslError हैंडलर का असुरक्षित कार्यान्वयन। क्या आप जानते हैं कि इसे कैसे हल किया जाए?
प्रतीक टैंक

2
Google ने Playstore पर App को Unsaif के रूप में चिह्नित किया है और यह ssl के बिना कैसे कर सकता है?
अजय पंड्या

सुपर विधि का उपयोग न करें- super.onReceivedSslError (दृश्य, हैंडलर, त्रुटि);
अतुल भारद्वाज

41

SSL प्रमाणपत्र सत्यापन को ठीक से संभालने और नई सुरक्षा नीति के अनुसार Google से एप्लिकेशन अस्वीकृति से बचने के लिए, जब भी सर्वर द्वारा प्रस्तुत प्रमाण पत्र आपकी अपेक्षाओं को पूरा करता है, तो SslErrorHandler.proceed () को लागू करने के लिए अपना कोड बदलें, और अन्यथा SslErrorHandler.candel () को आमंत्रित करें।

उदाहरण के लिए, मैं उपयोगकर्ता को पुष्टि करने के लिए एक चेतावनी संवाद जोड़ता हूं और लगता है कि Google अब चेतावनी नहीं दिखाता है।

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

इस बदलाव के बाद यह चेतावनी नहीं दिखाएगा।


क्या होगा यदि मैंने कार्यान्वयन से onReceivedSslError ब्लॉक हटा दिया?
विवेक सिन्हा

1
@VivekSinha इसे handler.cancel () कहेंगे; डिफ़ॉल्ट रूप से।
अनंत शाह

1
लेकिन Google ने अभी भी मेरे ऐप को इसी कारण से खारिज कर दिया। क्यों?
विवेक सिन्हा

@VivekSinha को प्ले स्टोर में ऐप लॉन्च के संबंध में कोई समाधान मिला?
केशा

2
मैंने सुझाव के अनुसार onReceivedSslError कॉलबैक लागू किया। ऐप को बाद में सफलतापूर्वक प्रकाशित किया गया था।
विवेक सिन्हा

11

नीचे दिए गए कोड को निकालें यह काम करेगा

 super.onReceivedSslError(view, handler, error);

महान, यह मेरे लिए काम किया। क्या आप बता सकते हैं कि यह कैसे काम करता है?
आर्थ तिलवा

3
Google डॉक्स से @ArthTilva: "डिफ़ॉल्ट व्यवहार लोड को रद्द करना है"। सुपर कॉल करके आप उस डिफ़ॉल्ट व्यवहार को कॉल कर रहे हैं इससे पहले कि यह बाकी विधि तक पहुंच सके। developer.android.com/reference/android/webkit/...
जोश लेयर्ड

11

overReceivedSslError को ओवरराइड करें और निकालें

Super.onReceivedSslError (दृश्य, हैंडलर, त्रुटि)

और Google सुरक्षा को हल करने के लिए:

setDomStorageEnabled (सही);

पूर्ण कोड है:

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

बहुत बहुत शुक्रिया यार। Super.onReceivedSslError (दृश्य, हैंडलर, त्रुटि) को हटाकर मेरे लिए काम किया।
डेनिश शर्मा

7

अपने कोड लाइन ब्रो को कॉपी और पेस्ट करें, यह मुझ पर भरोसा करेगा :) मैं सोच रहा हूं, आपको एक एसएसएल त्रुटि मिलती है। Sf आप ओवरराइड onSelSlError विधि का उपयोग करते हैं और सुपर को हटा दें यह सुपर विधि है। बस हैंडलर लिखें। सुधारें (), त्रुटि हल हो जाएगी।

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

धन्यवाद। onReceivedSslErrorमेरे दिन को बचाने के लिए हैंडलर.प्रोसेस () को कॉल करें
टैम ह्येनह

2
यदि आप ऐसा करते हैं (अब जुलाई 2019) तो Google play आपके आवेदन को अस्वीकार कर देगा।
अल्ट अल्तुनेल जुएल

, Google Play पर बहुत अधिक एप्लिकेशन हैं, कुछ भी ऐप अभी भी अस्वीकार नहीं करते हैं।
ओज़नकुरन

1
जनवरी 2020 को शब्दों को खारिज कर देंगे
जॉन रुबन सिंह

6

SSL को संभालने के लिए WebViewClient वर्ग से onReceivedSslError () विधि का उपयोग करता है , यह एक उदाहरण है:

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

        });

आप यहां मेरा पूरा उदाहरण देख सकते हैं: https://github.com/Jorgesys/Android-WebView-Logging

यहाँ छवि विवरण दर्ज करें


6

Google सुरक्षा को हल करने के लिए, यह करें:

शीर्ष पर रेखाएँ:

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

कोड:

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 के लिए नया हूँ। मैं इसे कहां रखूं? :)
गेदमिनस

5

मैंने उपरोक्त उत्तरों का पालन किया लेकिन फिर भी ऐसा लगता है कि मेरे लिए यह काम नहीं कर रहा है कि नीचे के कोड ने मेरे लिए एक चाल चली जब भुगतान gatways को एकीकृत किया जाता है जो आमतौर पर https अनुरोध होते हैं:

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

उपरोक्त कोड वेबव्यू में पोस्ट अनुरोध कर रहा है और भुगतान गेटवे पर पुनर्निर्देशित कर रहा है।

सेटिंग settings.setDomStorageEnabled(true);मेरे लिए एक चाल है आशा है कि यह मदद करता है।


2
यह समाधान COMPLETELY प्रमाणपत्र सत्यापन को अक्षम कर देता है, जिससे आप बीच-बीच में होने वाले हमलों के लिए खुले रहते हैं। यह कुछ ऐसा है जो आपको कभी नहीं करना चाहिए, भुगतान गेटवे के लिए ESPECIALLY।
डिर्बियो

मेरे लिए शुरू में वेबव्यू सामग्री लोड नहीं कर रहा था, बल्कि पृष्ठ की पृष्ठभूमि छवि थी। मैं बस के बाद webview.getSettings.setDomStorageEnabled(true);यह जादुई काम किया है। हो सकता है कि वेबपेज किसी तरह के एचटीएमएल 5 एपीआई का उपयोग कर रहा हो, इसलिए डोमेस्टोर को सक्षम करना मेरे लिए काम कर रहा है।
इशांत सागर

हैंडलर.प्रोसेस () एसएसएल को दरकिनार करते हुए
जॉन रुबन सिंह

Encodingutil.getbyte क्या है
आकाश कुमार

2

अनुशंसित दृष्टिकोण होगा

1. सुपर मेथड न बुलाएं (ओवरराइड विधि से सुपर कॉल निकालें)

2.Google किसी भी त्रुटि के आने पर SslErrorHandler.cancel () विधि को कॉल करने की सलाह देता है

3. एसएसएल त्रुटियों को उजागर करने के लिए शीघ्र संवाद न करें

सबसे अच्छा उपाय है ?? इस ओवरराइड विधि को निकालें

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

}

आप एक समाधान के लिए पूछ रहे हैं या एक सुझाव दे रहे हैं?
धर्मन

मैं इस दृष्टिकोण का सुझाव दे रहा हूं
जॉन रुबन सिंह

@JohnRubanSingh हाय जॉन, मैं संपत्ति से एक जेएस फ़ाइल लोड कर रहा हूं और एक बार onPageFinished के साथ भरी हुई फ़ाइल मैं JS के अंदर एक फ़ंक्शन कॉल कर रहा हूं। इसलिए, ओवरराइडिंग onReceivedSslError () neccessary है क्योंकि मैं webview.setWebViewClient (नया ....) का उपयोग कर रहा हूं?
शिवम शर्मा

यह कोड मेरे एपीके को अस्वीकार कर रहा है। 9 महीनों से यह कोड अस्वीकृति का कारण नहीं है, लेकिन अब अचानक अस्वीकृति r8 का सामना करना पड़ रहा है। स्विच (error.getPrimaryError ()) {मामला SslError.SSL_UNTRUSTED: handler.proceed (); टूटना; मामला SslError.SSL_EXPIRED: मामला SslError.SSL_IDMISMATCH: मामला SslError.SSL_NOTYETVALID: मामला SslError.SSL_DATE_INVALID: case SslError.SSL_INVIDID टूटना; }
शिवम शर्मा

@JohnRubanSingh कृपया मेरी मदद करें। हम सुस्त पर शामिल हो सकते हैं।
शिवम शर्मा

0

दो संपत्तियों को सेट करना मेरे लिए काम करने के लिए पर्याप्त था, और सुरक्षा मुद्दों को उजागर नहीं करता है:

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

0

इस लाइन का उपयोग अपने java कोड में webview.getSettings ()। SetDomStorageEnabled (सच) करें

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

0

यदि आप Google Play Store के बाहर एपीके का उपयोग करना चाहते हैं, उदाहरण के लिए, निजी निम्नलिखित की तरह एक समाधान शायद काम करेगा:

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

यदि आप सुरक्षा की एक अतिरिक्त वैकल्पिक परत जोड़ना चाहते हैं, तो आप सर्टिफिकेट पिनिंग का उपयोग करने का प्रयास कर सकते हैं । IMHO यह निजी या आंतरिक उपयोग के लिए कठिन नहीं है।

यदि आप Google Play Store पर ऐप प्रकाशित करने की योजना बनाते हैं, तो आपको @Override onReceivedSslError (...) {...} से बचना चाहिए विशेष रूप से हैंडलर का उपयोग करना। Google को यह कोड स्निपेट मिलेगा और हैंडलर के साथ समाधान के बाद से यह सुनिश्चित करने के लिए आपके ऐप को अस्वीकार कर देगा। सुरक्षित () सभी प्रकार के अंतर्निहित सुरक्षा तंत्रों को दबा देगा

और सिर्फ इस तथ्य के कारण कि ब्राउज़र आपके https कनेक्शन के बारे में शिकायत नहीं करते हैं, इसका मतलब यह नहीं है कि एसएसएल प्रमाण पत्र पर ही भरोसा किया जाता है!

मेरे मामले में, एसएसएल प्रमाणपत्र श्रृंखला टूट गई थी। आप एसएसएल चेकर के साथ ऐसे मुद्दों को जल्दी से परख सकते हैं या SSLLabs के साथ अधिक मध्यवर्ती कर सकते हैं । लेकिन कृपया मुझसे यह न पूछें कि यह कैसे हो सकता है। मेरे पास कोई सुराग नहीं है।

वैसे भी एसएसएल सर्टिफिकेट को रीइंस्टॉल करने के बाद, " वेबव्यू में अविश्वसनीय एसएसएल सर्टिफिकेट जो भी हो " के बारे में सभी त्रुटियां आखिरकार गायब हो गईं। मैंने onReceivedSslError (...) के लिए @Override को भी हटा दिया और हैंडलर.प्रोसेसर () से छुटकारा पा लिया , और मेरे ऐप को Google Play Store (फिर से) द्वारा अस्वीकार नहीं किया गया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.