首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

证书颁发机构在android webview中不受信任,但在移动浏览器中工作正常。

问题分析

当在Android WebView中遇到“证书颁发机构不受信任”的错误时,通常是因为WebView无法验证SSL/TLS证书的有效性。这种情况在移动浏览器中可能不会出现,因为这些浏览器通常会预装受信任的根证书。

基础概念

  1. SSL/TLS证书:用于加密网站和用户之间的通信,确保数据传输的安全性。
  2. 证书颁发机构(CA):负责颁发和管理SSL/TLS证书的可信第三方机构。
  3. WebView:Android平台上的一个组件,用于在应用程序中显示网页内容。

原因

  1. 缺少根证书:Android WebView可能没有预装某些CA的根证书。
  2. 证书链不完整:服务器提供的证书链可能不完整,导致WebView无法验证证书的有效性。
  3. 系统时间不正确:如果系统时间设置不正确,可能会导致证书验证失败。

解决方法

1. 预装根证书

可以通过以下步骤将缺失的根证书预装到Android设备上:

  1. 下载缺失的根证书文件(通常是.crt.cer格式)。
  2. 将证书文件复制到设备的/sdcard/Download/目录下。
  3. 使用ADB命令安装证书:
代码语言:txt
复制
adb shell pm install -r /sdcard/Download/certificate.crt
  1. 在代码中加载证书:
代码语言:txt
复制
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();
}

2. 检查证书链

确保服务器提供的证书链是完整的,并且包含所有必要的中间证书。

3. 校准系统时间

确保设备的系统时间是正确的,因为不正确的时间设置可能导致证书验证失败。

应用场景

这种情况常见于企业内部应用或需要使用自签名证书的应用中。通过预装根证书,可以确保WebView能够正确验证SSL/TLS证书的有效性。

参考链接

通过以上方法,可以有效解决Android WebView中证书颁发机构不受信任的问题。

相关搜索:React-Native-Webview:无法通过android模拟器连接到10.0.2.2。证书颁发机构不受信任查询在浏览器中工作正常,但在CLI中失败哪个X509 StoreName是指存储在Windows10中受信任的根证书颁发机构下的证书HTTP请求在浏览器中接收404,但在Postman中工作正常Flexbox在Android (Samsung)浏览器中无法正常工作WebView中的弹出对话框不在当前显示中,但在chrome浏览器中工作正常Ionic Firebase Facebook登录在浏览器中工作正常,但在Android上不能Android drawables在Debug中可以正常工作,但在发布时会变成黑色方块android应用程序在调试中完全正常工作,但在[ react native ]版本中崩溃无法从android中的服务获取数据,但在桌面上的web浏览器中工作正常Angular 2应用程序在Internet explore中不能正常工作,但在其他浏览器中工作良好网页在Android API 24的Webview中未完全加载,但在其他浏览器中完全加载Ionic :在Android中初始加载后数据不会被获取,在浏览器中工作正常无法在android模拟器中捕获对象,但在真实设备中也可以正常工作Admob横幅广告在Android 4.4 (KITKAT)中不显示,但在更高的apis级别中工作正常启动应用程序在android wix react-native-navigation抽屉中崩溃,但在iOS上工作正常我的html代码在我的电脑上运行得很好,但在浏览器中却无法正常工作。Unity Video Player URL Dropbox Video Streaming在构建到android时有错误,但在编辑器中工作正常在我的应用程序中配置multidex仍然可以在android studio上正常工作,但在尝试从play商店下载时会崩溃在Java 7中构建PKIX路径失败,但在Java 8中不能-尽管有浏览器信任的Let's Encrypt证书,但仍无法连接到我的HTTPS服务器
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的视频

领券