Skip to main content

Agregar certificado autofirmado para Mobile

Dejo el link al SAC y debajo el contenido por las dudas.

https://www.genexus.com/es/developers/websac?data=47478

Resumen

Como agregar certificado autofirmado o no reconocido en aplicaciones moviles para evitar errores de comunicación.

Android

En aplicaciones Android Offline / Online al hacer requets a url's que sirven sobre protocolo seguro https, regularmente se obtiene el mensaje de error:

"java.security.cert.CertPathValidatorException: Trust anchor for certification path not found"

cuando el certificado que habilita la comunicación SSL es autofirmado (Self-signed) o la empresa certificadora no es reconocida.

Como este certificado al ser autofirmado no es válido o la empresa certificadora no es reconocida en terminos de seguridad, para poder establecer comunicación se requiere que el propio certificado se agregue al dispositivo móvil.

Sin embargo a partir de la versión 24 y superiores (Nougat) ya no funciona agregar el certificado en el emulator/device --> Security Settings.

El detalle está aca:

https://android-developers.googleblog.com/2016/07/changes-to-trusted-certificate.html

Apps that target API Level 24 and above no longer trust user or admin-added CAs for secure connections, by default.

Como observan el tema viene por los cambios que hizo Google al respecto de los certificado, básicamente ahora se requiere que en el mismo apk se incluya el certificado, para agregar el certificado estos son los pasos:

  1. Obtener el certificado donde residen las url's a las que se hacen request, en formato PEM, por ejemplo en Firefox se obtiene de la siguiente manera:
    a) colocar la url en el navegador donde se hacen los request
    b) dar clic al icono del candado- conexion segura- mas informacion. Se abre un popup (informacion sobre esta pagina), dar clic en Ver Certificado
    c) Se abre una pagina con información del certificado, en la primera pestaña dar scroll hasta el nodo Miscelaneo y Descargar PEM (cert)
    Nota. El nombre del certificado no debe contener caracteres especiales

  2. copiar el archivo pem resultante en \mobile\Android<objeto_main>\src\main\res\raw
    Nota. Si se utiliza mas de un certificado, por ejemplo cuando se usan diversos sitios con Dynamic Services URL, se deben de agregar los mismos en este paso

  3. Modificar el archivo \Android\Templates\ApplicationProject\src\main\res\xml\network_security_config.xml,
    agregando estas lineas antes del cierre del tag network-security-config

  4. Ejecutar

Nota. Si se descarga el certificado desde otro medio seguir los siguientes pasos:

  1. Obtener el certificado del servidor donde residen las url's a las que se hacen request en formato Base-64 encoded (.CER)
  2. Usando el utilitario openssl cambiaremos la extension a .PEM,
    ejecutar openssl x509 -inform pem -in -outform der -out
    seguir los pasos 2,3 y 4 descritos anteriormente.

El error debe desaparecer.

IOS

  1. Agregar el certificado .pem primero como Profile al dispositivo, para ello se puede mandar por email el certificado al device y desde alli descargarlo, automáticamente e agregara el certifificado a los Profiles.

  2. Una vez agregado el certificado como profile hay que instalarlo en el propio device ( General --> Profile).
    En este punto es importante que el certificado cuente con estos linemanientos

https://support.apple.com/en-us/HT210176

Si no se cumplen los lineamientos, a instalar el certificado quedara en estatus "No verificado".

  1. Una vez que el certificado esta instalado y verificado, hay que habilitarlo, para ello ir en el device ( General --> About --> Cerrtificate Trust Settings.

Dentro de esta última opción se encuentra la sección "Enable Full Trust for Root Certiticates", la cúal debe listar el certificado instalado previamente, allí mismo habilitarlo.

  1. El error de comunicación debe desaparecer.

Nota:
El error mostrado en iOS es:

ATS failed system trust
Connection 1: system TLS Trust evaluation failed(-9802)
TLS Trust encountered error 3:-9802
Connection 1: encountered error(3:-9802)
HTTP load failed, 0/0 bytes (error code: -1200 [3:-9802])

Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server

caution

Tomado de wiki de DVelop