Publicado por Chad Brubaker, Equipo de seguridad de Android


En Android Nougat (7.0), hemos modificado la manera en que Android maneja las entidades de certificación de confianza (CA) a fin de ofrecer parámetros predeterminados más seguros para el tráfico de las aplicaciones. La mayoría de las aplicaciones y los usuarios no deberían verse afectados por estos cambios. Tampoco es necesario tomar medidas. Entre los cambios se incluye lo siguiente:
  • API seguras y sencillas para admitir CA personalizadas.
  • De forma predeterminada, ya no es necesario que las aplicaciones orientadas al nivel de API 24 y a niveles posteriores admitan CA agregados por usuarios o administradores para conexiones seguras.
  • Todos los dispositivos con Android Nougat ofrecen el mismo conjunto estandarizado de CA de sistema, no existen personalizaciones específicas según el dispositivo.

Continúa leyendo si deseas obtener más información sobre estos cambios y lo que se debe hacer si te afectan ellos.

API seguras y sencillas


Las aplicaciones siempre pudieron establecer de forma personalizada las entidades de certificación que admiten. Sin embargo, hemos visto que en algunas de ellas se producen errores debido a las complejidades de las API de seguridad de la capa de transporte (TLS) de Java. Para corregir esto, mejoramos las API a fin de personalizar la confianza.

CA agregadas por usuarios


Proteger todos los datos de las aplicaciones es uno de los objetivos claves del espacio de aplicaciones de Android. Android Nougat cambia la manera en que las aplicaciones interactúan con CA suministradas por administradores. De forma predeterminada, en las aplicaciones orientadas al nivel de API 24, por diseño, no se tendrán en cuenta tales CA a menos que lo hagan de forma explícita. Esta configuración segura de forma predeterminada reduce la superficie de ataque de las aplicaciones e impulsa el manejo uniforme de datos de aplicaciones basados en archivos.

Personalización de las CA de confianza


Personalizar CA de confianza para tu aplicación en Android es sencillo a través de la configuración de seguridad de red. Según sea necesario, la confianza se puede especificar en toda la aplicación o solo para conexiones con ciertos dominios. A continuación, se ofrecen algunos ejemplos para admitir una CA personalizada o agregada por los usuarios, además de las CA de sistema. Para hallar más ejemplos e información, consulta la documentación completa.

Admisión de CA personalizadas para depuración


A fin de permitir que tu aplicación admita CA personalizadas únicamente para depuraciones locales, incluye algo como lo siguiente en tu configuración de seguridad de red. Las CA solo serán de confianza mientras tu aplicación se marque como depurable.
<network-security-config>  
      <debug-overrides>  
           <trust-anchors>  
                <!-- Trust user added CAs while debuggable only -->
                <certificates src="user" />  
           </trust-anchors>  
      </domain-config>  
 </network-security-config>

Admisión de CA personalizadas para un dominio


A fin de permitir que tu aplicación admita CA personalizadas para un dominio específico, incluye algo como lo siguiente en tu configuración de seguridad de red.
<network-security-config>  
      <domain-config>  
           <domain includeSubdomains="true">internal.example.com</domain>  
           <trust-anchors>  
                <!-- Only trust the CAs included with the app  
                     for connections to internal.example.com -->  
                <certificates src="@raw/cas" />  
           </trust-anchors>  
      </domain-config>  
 </network-security-config>

Admisión de CA agregadas por usuarios para determinados dominios


A fin de permitir que tu aplicación admita CA personalizadas para varios dominios, incluye algo como lo siguiente en tu configuración de seguridad de red.
<network-security-config>  
      <domain-config>  
           <domain includeSubdomains="true">userCaDomain.com</domain>  
           <domain includeSubdomains="true">otherUserCaDomain.com</domain>  
           <trust-anchors>  
                  <!-- Trust preinstalled CAs -->  
                  <certificates src="system" />  
                  <!-- Additionally trust user added CAs -->  
                  <certificates src="user" />  
           </trust-anchors>  
      </domain-config>  
 </network-security-config>

Admisión de CA agregadas por usuarios para casi todos los dominios


A fin de permitir que tu aplicación admita CA personalizadas para todos los dominios, a excepción de los que se especifiquen, incluye algo como lo siguiente en tu configuración de seguridad de red.
<network-security-config>  
      <base-config>  
           <trust-anchors>  
                <!-- Trust preinstalled CAs -->  
                <certificates src="system" />  
                <!-- Additionally trust user added CAs -->  
                <certificates src="user" />  
           </trust-anchors>  
      </base-config>  
      <domain-config>  
           <domain includeSubdomains="true">sensitive.example.com</domain>  
           <trust-anchors>  
                <!-- Only allow sensitive content to be exchanged  
             with the real server and not any user or  
    admin configured MiTMs -->  
                <certificates src="system" />  
           <trust-anchors>  
      </domain-config>  
 </network-security-config>

Admisión de CA agregadas por usuarios para todas las conexiones seguras


A fin de permitir que tu aplicación admita CA agregadas por usuarios para todas las conexiones seguras, incluye lo siguiente en tu configuración de seguridad de red.
<network-security-config>  
      <base-config>  
            <trust-anchors>  
                <!-- Trust preinstalled CAs -->  
                <certificates src="system" />  
                <!-- Additionally trust user added CAs -->  
                <certificates src="user" />  
           </trust-anchors>  
      </base-config>  
 </network-security-config>

Conjunto estandarizado de CA de confianza del sistema


Para brindar una experiencia más uniforme y segura en el ecosistema de Android, a partir de Android Nougat, los dispositivos compatibles admitirán únicamente las CA de sistema estandarizadas de AOSP.

Antes, el conjunto de CA preinstaladas que se incluían en el sistema podían variar de un dispositivo a otro. Esto podía generar problemas de incompatibilidad si en algunos dispositivos no se incluían las CA que necesitaban las aplicaciones para las conexiones, y también problemas de seguridad si se incluían CA que no cumplieran con nuestros requisitos de seguridad en algunos dispositivos.

¿Qué sucede si cuento con una CA que a mi entender debe incluirse en Android?


En primer lugar, asegúrate de que tu CA deba incluirse en el sistema. Las CA preinstaladas solo son para CA que cumplan con nuestros requisitos de seguridad, ya que afectan las conexiones seguras de la mayoría de las aplicaciones en el dispositivo. Si necesitas agregar una CA para la conexión con hosts que la usen, como alternativa debes personalizar entre tus aplicaciones y servicios aquellos que se conecten a dichos hosts. Para obtener más información, consulta la sección Personalización de las CA de confianza que se encuentra arriba.

Si usas una CA que, según tu parecer, debería incluirse en Android, primero completa el proceso de inclusión de CA de Mozilla y luego presenta una solicitud de función en Android para que se agregue la CA al conjunto estandarizado de CA de sistema.