Android WebView setCertificate发出SSL问题

我看过很多关于SSL错误的post和信息,我自己偶然发现了一个。

我试图通过带有GlobalSign CA BE证书的Android WebView访问网页,我收到了一个不可信的错误。

对于大多数手机来说,它可以正常处理这个问题,并告诉处理程序继续。

但是,有些手机最终会在webview-client中收到onReceivedError,告诉它无法与服务器建立联系。 这是在经过onReceivedSslError并继续进行之后发生的。

我搜索了一些描述并find了很多涉及HttpClient的描述,并且安装了你自己的证书,或者只是欺骗它接受所有。

但是,由于我使用的是WebView,我以为我会使用WebView.setCertificate(SslCertificate crt)。 我搜索了这个函数的讨论,但没有find太多/任何信息。

我拿到了据说不受信任的证书,并且执行了以下代码:

try{ Certificate myCert = CertificateFactory.getInstance("X509"). generateCertificate(this.getResources(). openRawResource(R.raw.globalsign_ca_be)); X509Certificate x509 = (X509Certificate) myCert; SslCertificate sslCert = new SslCertificate(x509); webView.setCertificate(sslCert); } catch (CertificateException ex){ ex.printStackTrace(); } 

使用包含以下内容的.cer文件:

—– BEGIN CERTIFICATE —– MIIEbjCCA1agAwIBAgILBAAAAAABElatYgQwDQYJKoZIhvcNAQEFBQAwVzELMAkG A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0wNzA1MDQxMDAw MDBaFw0xNDAxMjcxMTAwMDBaMHExCzAJBgNVBAYTAkJFMR0wGwYDVQQLExREb21h aW4gVmFsaWRhdGlvbiBDQTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEoMCYG A1UEAxMfR2xvYmFsU2lnbiBEb21haW4gVmFsaWRhdGlvbiBDQTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBALSfSeaznwFVNtA2lWzLFlpscrXineL6OekK 3HNcoDt2bQUokw2lQvPoy + 7TMxoTJwrfXNFUYmqaFzbWPFiHHrJmH1VpK4lWR7TC UAzlXcH9KRtmc0P0b9EUTyptSFI69eSQP96y9BDV + fqslg0QMiPS01GnlYVQ + G8P naeITg0xm0RBjkEvbpoatLalWfFJWQl + fknTaTNLAJLFG0Igafhk39inRNGQXv05 rWt9 / tWLpAFk9qe0IITMBS8n7h7VJJauhEOkPkPzO5nX + fLePRnt0GXxScpI0jh9 xkjXcmG4xsJnCthlWv1b88X9voxpz5kgtursOYDpZqjuPZ1Ge4cCAwEAAaOCAR8w ggEbMA4GA1UdDwEB / wQEAwIBBjASBgNVHRMBAf8ECDAGAQH / AgEAMEsGA1UdIARE MEIwQAYJKwYBBAGgMgEKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuZ2xvYmFs c2lnbi5uZXQvcmVwb3NpdG9yeS8wHQYDVR0OBBYEFDYSTp5xxCZB8frxKUy / F6 RT KLbrMDMGA1UdHwQsMCowKKAmoCSGImh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5uZXQv cm9vdC5jcmwwEQYJYIZIAYb4QgEBBAQDAgIEMCAGA1UdJQQZMBcGCisGAQQBgjcK AwMGCWCGSAGG + EIEATAfBgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo // z9SzAN BgkqhkiG9w0BAQUFAAOCAQEAwyV5SvrNJm9AariUG + ag4WvSMZo / ifvFCiJ1ev27 QDScvJ6FSVl6lcwNLUQLx8sVEB7S3ON46l / 1NVGmyD85kBWeXxXJt49da2OZaOFu XPydNzMKrodwSqLjqyZ9cwfk9wqqdY + m7psE0QVDdBq61MKdf7egbO0WmmdAVquD n0yc6yg0H43mWg9pQNmpnmr5iX / Q + IyzSC4LT / H5z / UOEQIMiRZzU10s0 + / eXwsl utVOj4WQP4iTeaUgrP + wisvLpVV4gzlBMqpdJZOn6u4YcrXiHX8IdBG2ASdOls + O 8Cr5UqwkGhmen2xSfIs6plTewcchfTrTvBqobfK / 33bKAw == —– END CERTIFICATE– —

它毫无例外地完成了,但我的webview仍然有相同的行为。 首先是SSL错误,然后是错误,说它无法通信/加载页面。

如果有人有一些信息,可以在WebView中正常运行SSL,甚至只是帮助调试这个。 我将不胜感激。

我的头脑也有点爆炸,因为我开始时并不是非常有经验的SSL。

*这是公钥,顺便说一句,没什么令人兴奋的;)(GlobalSign CA BE)

更多信息:sslexception:主要错误:3证书:颁发给:CN = GlobalSign域validationCA,O = GlobalSign nv-sa,OU =域validationCA,C = BE;

发布者:CN = GlobalSign根CA,OU =根CA,O = GlobalSign nv-sa,C = BE;

错误3是,SSL_UNTRUSTED

但我确实感觉setCertificate函数不是为缺少的根或类似物添加可信证书,而是添加客户端证书以识别期望的服务器。 关于这个function的更多信息会很好,但似乎有点无证。

我通过一个名为ssltest.net的网站运行confied.payex.com:443获取CA并从那里下载证书。

我试图解码证书,但它似乎没有效果(实际上我测试了2个不同的X509实现,两者都给了我“错误的编码”错误)。

您能否提供有关SSL例外的更多详细信息?

我没有find有关setCertificate方法的更多信息。 我认为这种方法需要服务器证书。 您应该确保您解密的证书是最终实体证书而不是CA证书。

如果您使用的是InMobi sdk,只需将其更新为最新版本即可修复此警告。 更多信息请参见Sohan的回答

信息

如果您有一个WebClient覆盖onReceivedSSLError()函数并调用handler.proceed()API,它可以解决错误3的证书问题,我在Android 4.4和6.0上测试过。

如果在函数onReceivedError()中仍然得到errorCode(-1),则需要在某个时候检查服务器端实现,尤其是在调用POST方法而不是GET方法时,因为如果出现意外,服务器可能不会返回任何内容POST参数。

祝你好运。