当在Android WebView中遇到“证书颁发机构不受信任”的错误时,通常是因为WebView无法验证SSL/TLS证书的有效性。这种情况在移动浏览器中可能不会出现,因为这些浏览器通常会预装受信任的根证书。
可以通过以下步骤将缺失的根证书预装到Android设备上:
.crt
或.cer
格式)。/sdcard/Download/
目录下。adb shell pm install -r /sdcard/Download/certificate.crt
WebView webView = findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
try {
AssetManager assetManager = getAssets();
InputStream inputStream = assetManager.open("certificate.crt");
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
InputStream caInput = new BufferedInputStream(inputStream);
Certificate ca;
try {
ca = certificateFactory.generateCertificate(caInput);
System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN());
} finally {
caInput.close();
}
String keyStoreType = KeyStore.getDefaultType();
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(keyStore);
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed(); // Ignore SSL certificate errors
}
});
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
});
webView.loadUrl("https://your-url.com");
} catch (Exception e) {
e.printStackTrace();
}
确保服务器提供的证书链是完整的,并且包含所有必要的中间证书。
确保设备的系统时间是正确的,因为不正确的时间设置可能导致证书验证失败。
这种情况常见于企业内部应用或需要使用自签名证书的应用中。通过预装根证书,可以确保WebView能够正确验证SSL/TLS证书的有效性。
通过以上方法,可以有效解决Android WebView中证书颁发机构不受信任的问题。
领取专属 10元无门槛券
手把手带您无忧上云