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:証明書パスの信頼アンカーが見つかりません。
@Override ます。public void onReceivedSslError(WebViewのビュー、SslErrorHandlerハンドラ、 SslErrorエラー){// super.onReceivedSslError(ビュー、ハンドラ:ここ
は、提案された回避策と同様の質問です、エラー)。 Log.d( "ann"、 "SSL error"); handler.proceed(); }スーパー機能にコメントした後、私の仕事が始まった。 –この回避策を使用すると、証明書のチェックをバイパスできます。論理を処理して、ファイルとして含めている証明書をもう一度チェックする必要があります。さもなければ、それはhttpsを使用しないのと同じです。 – Juan