我在Android应用程序中遇到问题。当我尝试在Webview中加载网址时,它给了我ssl错误不受信任的证书。

该网址可以在手机和PC上正常打开,但在我的webview上却不会。网址具有oauth2登录限制...

我试过使用onReceivedSslError并将其赋予handler.proceed()并且可以工作..但这是不安全的,因为它绕过了所有ssl安全性,并且Google Play商店不允许您使用此行代码发布应用。

请,需要帮助!

最佳答案

  Certificate certificate;
  CertificateFactory cf = null;
    try {
        cf = CertificateFactory.getInstance("X.509");
    InputStream caInput = getResources().openRawResource(R.raw.cert);
    certificate = cf.generateCertificate(caInput);
    caInput.close();

    } catch (CertificateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }


如下所示添加onReceivedSslError。使用url使用的证书检查原始文件中的证书,以便使用cert.verify对其进行验证

 @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {

            SslCertificate sslCertificate = error.getCertificate();
            Certificate cert = getX509Certificate(sslCertificate);
            if (cert != null && certificate != null){
                try {
                    cert.verify(certificate.getPublicKey());
                    handler.proceed();
                } catch (CertificateException | NoSuchAlgorithmException | InvalidKeyException | NoSuchProviderException | SignatureException e) {
                    super.onReceivedSslError(view, handler, error);
                    handler.cancel();
                    e.printStackTrace();
                }
            } else {
                super.onReceivedSslError(view, handler, error);
            }
            super.onReceivedSslError(view, handler, error);
        }


添加生成证书的代码段功能,如下所示

private Certificate getX509Certificate(SslCertificate sslCertificate) {
    Bundle bundle = SslCertificate.saveState(sslCertificate);
    byte[] bytes = bundle.getByteArray("x509-certificate");
    if (bytes == null) {
        return null;
    } else {
        try {
            CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
            return certFactory.generateCertificate(new ByteArrayInputStream(bytes));
        } catch (CertificateException e) {
            return null;
        }
    }
}



  为了正确处理SSL证书验证,请更改代码以在服务器提供的证书满足您的期望时调用SslErrorHandler.proceed(),否则,调用SslErrorHandler.cancel()。包含受影响的应用和类的电子邮件警报已发送到您的开发者帐户地址。


如果您使用onReceivedSslError上传您的应用并使用handler.proceed而不检查证书,这就是Google安全警报将显示的内容。

希望能帮助到你!!

10-07 22:24