android - type - verificar ssl
Android WebView setCertificate emite problemas de SSL (3)
He visto muchas publicaciones e información sobre errores de SSL y me he topado con una.
Intento acceder a una página web a través de Android WebView con un certificado CA BE de GlobalSign, y recibo un error no confiable.
Para la mayoría de los teléfonos, funciona bien para manejar esto, y simplemente dile al manejador que continúe.
Algunos teléfonos, sin embargo, terminan obteniendo un error recibido en el cliente webview, diciéndole que no puede establecer contacto con el servidor. Esto sucede después de que ha pasado por el onReceivedSslError y continúa.
Busqué descripciones y encontré muchas descripciones relacionadas con HttpClient e instalando tu propio certificado o simplemente engañándolo para que lo aceptara todo.
Sin embargo, dado que estaba usando WebView, pensé que haría uso de WebView.setCertificate (SslCertificate crt). Busqué discusiones sobre esta función, pero no encontré mucha / ninguna información.
Obtuve el certificado del que se decía que no era de confianza, e hice este código:
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();
}
Con un archivo .cer que contiene esto:
----- 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-- ---
Se completó sin excepción, pero aún obtuve el mismo comportamiento de mi vista web. Primero un error SSL y luego un error que dice que no pudo comunicarse / cargar la página.
Si alguien tiene algo de información, ha podido hacer que SSL funcione correctamente en WebView, o incluso solo ayuda para depurar esto. Me sería de gran aprecio.
Mi cabeza también está explotando un poco, porque para empezar no tengo mucha experiencia en SSL.
* es una clave pública, por cierto, nada emocionante;) (GlobalSign CA BE)
algo más de información: la excepción ssl: error primario: certificado 3: Emitido a: CN = Certificación de dominio GlobalSign CA, O = GlobalSign nv-sa, OU = Domain Validation CA, C = BE;
Emitido por: CN = GlobalSign Root CA, OU = Root CA, O = GlobalSign nv-sa, C = BE;
el error 3 es SSL_UNTRUSTED
Sin embargo, tengo la sensación de que la función setCertificate no es agregar un certificado confiable para una raíz faltante o similar, sino agregar un certificado de cliente para identificarlo con un servidor que espera uno. Sin embargo, estaría bien con más información sobre esta función, parece un poco indocumentada.
Obtuve la CA ejecutando confied.payex.com:443 a través de un sitio llamado ssltest.net y descargando el certificado de allí.
Traté de decodificar el certificado, pero no parece ser válido (de hecho, probé 2 implementaciones distintas de X509 y ambas me dieron un error de "codificación incorrecta").
¿Puedes dar más detalles sobre la excepción SSL?
No encontré mucha información sobre el método setCertificate
. Creo que este método espera el certificado del servidor. Debe asegurarse de que el certificado que decodifica es el certificado de entidad final y no un certificado de CA.
Si tiene un WebClient que anula la función onReceivedSSLError () y llama a la API handler.proceed (), puede resolver el problema de certificado de error 3, que probé en Android 4.4 y 6.0.
Si todavía obtiene un código de error (-1) en la función onReceivedError (), necesita verificar la implementación del servidor en algún momento, especialmente cuando llame al método POST en lugar del método GET, porque el servidor puede devolver nada si no se produce Parámetros de POST
Buena suerte.
Si está usando InMobi sdk, simplemente actualícelo a la última versión y esta advertencia será reparada. Más información aquí en la respuesta de Sohan