WebView funktioniert gut mit http Anfragen und auch https, wo bekannte vertrauenswürdige Sites wie https://www.online.citibank.co.in/ Aber ich versuche, private Website mit CA von 3rd Party ausgestellt, gibt es leeren Bildschirm. Das Zertifikat wird über die SD-Karte auf dem Telefon installiert und in der Liste vertrauenswürdiger Zertifikate aufgeführt.Android WebView laden https url Ergebnisse in leeren Bildschirm
Wenn ich die gleiche URL mit HttpsURLConnection nach dem Hinzufügen des Zertifikats zu TrustManager versuchte, funktioniert es gut (in der Lage, den Inhalt zu erhalten).
Im Folgenden sind die Code-Snippets für WebView und HttpsURLConnection.
HttpsURLConnection: Dieser Code unten funktioniert und in der Lage, den Inhalt der URL zu bekommen (ich bin nicht in der Lage, die URL zu teilen, wie es von außen nicht zugänglich Welt)
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 : der Rückruf genannt Ein Problem, onReceivedSslError
{
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();
}
});}
}
helfen Bitte mir mit Vorschlag. WebViewClient-Ausnahme ist I/X509Util: Fehler beim Überprüfen der Zertifikatskette, Fehler: java.security.cert.CertPathValidatorException: Vertrauensanker für Zertifizierungspfad nicht gefunden.
@Override public void onReceivedSslError (WebView Ansicht, SslErrorHandler Handler, SslError Fehler) {// super.onReceivedSslError (Ansicht, Handler , Error); Log.d ("Ann", "SSL-Fehler"); handler.proceed(); } nach dem Kommentieren der Superfunktion Dinge begannen für mich zu arbeiten. –
Beachten Sie, dass Sie mit dieser Problemumgehung die Überprüfung des Zertifikats umgehen können. Sie sollten die Logik behandeln, um dies zu überprüfen, indem Sie das Zertifikat, das Sie als Datei einschließen, überprüfen. Ansonsten ist es so, als würde man https nicht benutzen. – Juan