2017-08-24 14 views
1

WebViewはよく知られている信頼できるサイト(https://www.online.citibank.co.in/ など)を使用してプライベートサイトにアクセスしようとしていますが、証明書はSDカード経由で電話機にインストールされ、信頼できる証明書リストの下に表示されます。Android WebViewがhttps urlをロードすると空白の画面が表示される

証明書をTrustManagerに追加した後でHttpsURLConnectionを使用して同じURLを試したところ、正常に動作しています(コンテンツを取得できる)。

以下は、WebViewとHttpsURLConnectionのコードスニペットです。

のHttpsURLConnection:

try 
{ 
    SSLContext context = null; 

    CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
    InputStream caInput = getResources().openRawResource(R.raw.mi_net); 
    Certificate ca; 
    try { 
     ca = cf.generateCertificate(caInput); 
    } finally { 
     caInput.close(); 
    } 

    // Create a KeyStore containing our trusted CAs 
    String keyStoreType = KeyStore.getDefaultType(); 
    KeyStore keyStore = KeyStore.getInstance(keyStoreType); 
    keyStore.load(null, null); 
    keyStore.setCertificateEntry("ca", ca); 

    // Create a TrustManager that trusts the CAs in our KeyStore 
    String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); 
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); 
    tmf.init(keyStore); 

    // Create an SSLContext that uses our TrustManager 
    context = SSLContext.getInstance("TLS"); 
    context.init(null, tmf.getTrustManagers(), null); 

    url = new URL(urlStr); 
    HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); 
    con.setSSLSocketFactory(context.getSocketFactory()); 
    con.setInstanceFollowRedirects(true); 

    con.setDoOutput(false); 
    con.setConnectTimeout(1000); 
    String responseMsg = con.getResponseMessage(); 
    response = con.getResponseCode(); 
    is = con.getInputStream(); 
} 

のWebViewこれ以下のコードは、罰金やURLからコンテンツを取得することができ作品(それは外の世界からアクセスできないように私は、URLを共有することはできませんよ) :動作していない、提案で私を助けてください

{ 
    WebSettings viewSettings = webView.getSettings(); 
    viewSettings.setJavaScriptEnabled(true); 
    viewSettings.setAllowContentAccess(true); 
    viewSettings.setBuiltInZoomControls(false); 
    webView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH); 
    webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 
    webView.loadUrl(sameURL); 

    webView.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onPageStarted(final WebView view, final String url, Bitmap favicon) { 
      Log.d("ann", "onPageStarted"); 

     } 

     @Override 
     public void onPageFinished(final WebView view, String url) { 
      Log.d("ann", "inside onPageFinished"); 
     } 

     @Override 
     public void onReceivedError(WebView view, int errorCode, 
            String description, String failingUrl) { 

      if (!failingUrl.startsWith("mailto:")) { 
       webView.loadUrl("file:///android_asset/html/error.html"); 
      } 

     } 

     @Override 
     public void onReceivedSslError(WebView view, SslErrorHandler handler, 
             SslError error) { 
      super.onReceivedSslError(view, handler, error); 
      Log.d("ann","SSL error"); 

      handler.proceed(); 
     } 

    });} 
} 

onReceivedSslErrorコールバックと呼ばれます。 WebViewClient例外はです。I/X509Util:証明書チェーンの検証に失敗しました。エラー:java.security.cert.CertPathValidatorException:証明書パスの信頼アンカーが見つかりません。

答えて

0

HttpsUrlConnectionの場合、ファイルから証明書を作成し、実行時に設定します。

Webviewは、システムに既に存在するものを使用している必要があります。

Check in the onReceivedSslError() method of a WebViewClient if a certificate is signed from a specific self-signed CA

+0

@Override ます。public void onReceivedSslError(WebViewのビュー、SslErrorHandlerハンドラ、 SslErrorエラー){// super.onReceivedSslError(ビュー、ハンドラ:ここ

は、提案された回避策と同様の質問です、エラー)。 Log.d( "ann"、 "SSL error"); handler.proceed(); }スーパー機能にコメントした後、私の仕事が始まった。 –

+0

この回避策を使用すると、証明書のチェックをバイパスできます。論理を処理して、ファイルとして含めている証明書をもう一度チェックする必要があります。さもなければ、それはhttpsを使用しないのと同じです。 – Juan

関連する問題