2016-02-05 7 views
12

मैं एंड्रॉइड वेबव्यू में एसएसएल प्रमाणपत्र त्रुटियों को संभालने का एक उचित तरीका खोजने की कोशिश कर रहा हूं। मेरा लक्ष्य SSL प्रमाणपत्र त्रुटियों वाले पृष्ठों को लोड करने का तरीका प्रदान करना है, लेकिन उपयोगकर्ता को सुरक्षा चेतावनी के साथ URL लोड करने का प्रयास करने के बाद उसे पृष्ठ लोड करने का विकल्प चुनने दें।एंड्रॉइड वेबव्यू में सर्टिफिकेट त्रुटियों को संभालना और सर्टिफिकेट पियर्स को साफ़ करना

निकटतम समाधान मैं धागे में पाया निम्नलिखित के रूप में WebViewClient अधिभावी सलाह देते हैं:

webView.setWebViewClient(new WebViewClient() { 
    @Override 
    public void onReceivedSslError(final WebView view, final SslErrorHandler handler, final SslError error) { 
     handler.proceed(); 
    } 
}); 

हालांकि इस मूल रूप से उपयोगकर्ता सहमति के बिना WebView में एसएसएल अक्षम करता है।

Android WebView SSL 'Security Warning'

Does the Web View on Android support SSL?

Android WebView not loading an HTTPS URL

android webview with client certificate

Web view shows blank/white page after loading URL when using WIFI in Android

:

संदर्भ के लिए यहाँ धागे जहां मुझे लगता है कि समाधान कर रहे हैं

Unable to load a specific webpage on Android webview

WebView displays a blank view for certain links

Android WebView blocks redirect from https to http

Ignore ssl certificate requests in webview

मैं आगे चला गया और जो उपयोगकर्ता को संकेत देता एक अलग संस्करण लागू किया:

webView.setWebViewClient(new WebViewClient() { 
    @Override 
    public void onReceivedSslError(final WebView view, final SslErrorHandler handler, final SslError error) { 
     //Showing a first confirmation dialog 
     AndroidUtils.showYesNoDialog(
      //First confirmation message 
      "WARNING - THIS PAGE IS NOT SECURE! Are you sure you want to continue loading it?", 
      //First confirmation "YES" option runnable 
      new Runnable() { 
       @Override 
       public void run() { 
        //Showing a second confirmation dialog 
        AndroidUtils.showYesNoDialogWithResId(
         //Second confirmation message 
         "You chose to load an unsecure page, are you sure you want to do that?", 
         //Second confirmation "YES" option runnable 
         new Runnable() { 
          @Override 
          public void run() { 
           //Disregard the error and proceed with the bad certificate anyways 
           handler.proceed(); 
          } 
         }, 
         //Second confirmation "NO" option runnable 
         new Runnable() { 
          @Override 
          public void run() { 
           //Cancel loading the page with that certificate error 
           handler.cancel(); 
          } 
         } 
        ); 
       } 
      }, 
      //First confirmation "NO" option runnable 
      new Runnable() { 
       @Override 
       public void run() { 
        //Cancel loading the page with that certificate error 
        handler.cancel(); 
       } 
      }); 
    } 
}); 

इस कार्यान्वयन उपयोगकर्ता पूछता है दो बार अगर एच ई पृष्ठ को लोड करना चाहता है, अगर वह दो बार कहता है, तो त्रुटि को नजरअंदाज कर दिया जाता है और पेज लोड होता है, अन्यथा पेज लोडिंग रद्द हो जाती है।

पहली बार प्रमाणपत्र त्रुटि लोड के साथ एक यूआरएल, WebViewClient.onReceivedSslError कहा जाता है, लेकिन यदि प्रमाणपत्र त्रुटि और SslErrorHandler.proceed() साथ उपयोगकर्ता आय कहा जाता है, निम्नलिखित समय उसी यूआरएल भार, WebViewClient.onReceivedSslError फिर कभी नहीं कहा जाता है: केवल एप्लिकेशन की हत्या इस व्यवहार को रीसेट करता है।

मैं WebViewClient.onReceivedSslError को व्यवस्थित रूप से बुलाया जाना चाहूंगा जब प्रमाण पत्र त्रुटि वाला यूआरएल लोड हो, केवल पहली बार नहीं। बाद SslErrorHandler.proceed() बुलाया गया है

/** JAVADOC QUOTE: Clears the SSL preferences table stored in response to proceeding with SSL certificate errors.*/ 
webView.clearSslPreferences(); 
//Those other methods I tried out of despair just in case 
webView.clearFormData(); 
webView.clearCache(true); 
webView.clearHistory(); 
webView.clearMatches(); 

किसी को भी कैसे एक ही URL के लिए एक बार से WebView कॉल WebViewClient.onReceivedSslError अधिक बनाने के लिए पता है, मैं सफलता के बिना उन तरीकों कॉल करने की कोशिश?

+0

आपको कोई समाधान मिला है?> –

+0

नहीं मुझे अभी तक कोई समाधान नहीं मिला है। – androidseb

+0

@KingofMasses रात अपने देश में इतने लंबे समय लेने के लिए? बस मजाक कर, क्या आप कृपया पोस्ट कर सकते हैं? मैं इस ... – user2582318

उत्तर

0

हाँ, तुम यहाँ की तरह clearSslPreferences() का उपयोग कर सकते हैं:

webView.clearSslPreferences() 

यह WebView

2

की इस वस्तु कभी विधि onReceivedSslError ओवरराइड न करें के लिए अपने निर्णय को स्पष्ट करेंगे।गोयल प्ले आपके अपलोड को अस्वीकार कर देगा, एसएसएल त्रुटि का उपयोग webSettings.setDomStorageEnabled(true);

+0

धन्यवाद बहुत बहुत भाई, Google Play में अस्वीकार कर दिया गया है कि इस मुद्दे की वजह से मेरी अपडेट नहीं हुआ है, लेकिन यह सिर्फ जब करने के लिए 'setDomStorageEnabled' की स्थापना को स्वीकार कर लिया है' –

+1

TRUE' @MahmoudElshamy आप कर रहे हैं स्वागत है खुश यह काम किया :-) –

+0

धन्यवाद। यह काम कर रहा है और परीक्षण किया गया है। –

0

मैं केवल उस उत्तर को पोस्ट करूंगा जो Tssomas ने मूल प्रश्न की टिप्पणियों में दिया है, क्योंकि इस समय के बाद, यह एकमात्र समाधान है जो भरोसेमंद काम करता है यह एक हैक है।

Tssomas का हवाला देते हुए:

उपयोगकर्ता आय, उनकी प्राथमिकता आगे बढ़ो, तो करने के लिए वैसे भी केवल उस सत्र के लिए रखा जाता है (वे एप्लिकेशन को बंद करने और इसे फिर से शुरू संवाद फिर से शो होगा अगर)। तो क्या मुझे यकीन है कि उपयोगकर्ता संवाद हर बार एक सरणी सूची में असुरक्षित यूआरएल जोड़ सकते हैं और एक जांच जोड़ने के लिए था देखता है ताकि हर बार वेबव्यू लोड हो जाने, सरणी सूची वेबव्यू की वर्तमान यूआरएल के लिए जाँच की है बनाने के लिए किया था । तो फिर निश्चित रूप से, अगर सरणी सूची वर्तमान url होता है, संवाद .. सब पर अपनी नहीं एक सुंदर समाधान दिखा लेकिन यह काम करता है ...

इस कोड की तरह दिखाई दे सकता है ..

//This has to be static because it will be reset only once the app process is killed 
private static final Set<String> unsecureURLSet = new TreeSet<>(); 

webView.setWebViewClient(new WebViewClient() { 
    @Override 
    public void onReceivedSslError(final WebView view, final SslErrorHandler handler, final SslError error) { 
     //Adding the insecure URL to the set 
     unsecureURLSet.add(error.getUrl()); 
     //Showing a first confirmation dialog 
     AndroidUtils.showYesNoDialog(
      //First confirmation message 
      "WARNING - THIS PAGE IS NOT SECURE! Are you sure you want to continue loading it?", 
      //First confirmation "YES" option runnable 
      new Runnable() { 
       @Override 
       public void run() { 
        //Showing a second confirmation dialog 
        AndroidUtils.showYesNoDialogWithResId(
         //Second confirmation message 
         "You chose to load an unsecure page, are you sure you want to do that?", 
         //Second confirmation "YES" option runnable 
         new Runnable() { 
          @Override 
          public void run() { 
           //Disregard the error and proceed with the bad certificate anyways 
           handler.proceed(); 
          } 
         }, 
         //Second confirmation "NO" option runnable 
         new Runnable() { 
          @Override 
          public void run() { 
           //Cancel loading the page with that certificate error 
           handler.cancel(); 
          } 
         } 
        ); 
       } 
      }, 
      //First confirmation "NO" option runnable 
      new Runnable() { 
       @Override 
       public void run() { 
        //Cancel loading the page with that certificate error 
        handler.cancel(); 
       } 
      }); 
    } 

    @Override 
    public boolean shouldOverrideUrlLoading(final WebView _view, final String _url) { 
     if (unsecureURLSet.contains(_url)){ 
      //Code here should mimic the dialog in onReceivedSslError 
      //And replace the "handler.proceed()" with a forced load of _url 
      return true; 
     } 
     return super.shouldOverrideUrlLoading(_view, _url); 
    } 
}); 
संबंधित मुद्दे