¿Cómo instalar el certificado de CA de confianza en un dispositivo Android?


He creado mi propio certificado de CA y ahora quiero instalarlo en mi dispositivo Android Froyo (HTC Desire Z), para que el dispositivo confíe en mi certificado.

Android almacena los certificados de CA en su almacén de claves Java en /system/etc/security/cacerts.bks. Copié el archivo a mi computadora, agregué mi certificado usando portecle 1.5 y lo devolví al dispositivo.

Ahora, Android no parece recargar el archivo automáticamente. He leído en varias publicaciones de blog que necesito reiniciar el dispositivo. Al hacerlo, el archivo se sobrescribe con el original de nuevo.

Mi siguiente intento fue instalar el certificado desde la tarjeta SD copiándolo y utilizando la opción correspondiente del menú de configuración. El dispositivo me dice que el certificado ha sido instalado, pero al parecer no confía en el certificado. Además, cuando intento copiar el almacén de claves a mi computadora, todavía encuentro el stock original cacerts.bks.

Entonces, ¿cuál es la forma correcta de instalar mi propio certificado de CA raíz en ¿un dispositivo Android 2.2 como certificado de confianza? ¿Hay alguna forma de hacerlo programáticamente?

Author: Björn Marschollek, 2010-12-16

7 answers

Antes de Android KitKat tienes que rootear tu dispositivo para instalar nuevos certificados.

Desde Android KitKat (4.0) hasta Nougat (7.0) es posible y fácil. Pude instalar el certificado de proxy de Debbuging de Charles Web en mi dispositivo sin rootear y oler con éxito el tráfico SSL.

Extracto de http://wiki.cacert.org/FAQ/ImportRootCert

Antes de la versión de Android 4.0, con la versión de Android Gingerbread & Froyo, había un solo archivo de solo lectura (/system / etc / security / cacerts.bks) que contiene el almacén de confianza con todos los certificados de CA ('sistema') de confianza de forma predeterminada en Android. Tanto las aplicaciones del sistema como todas las aplicaciones desarrolladas con el SDK de Android usan esto. Utilice estas instrucciones para instalar certificados CAcert en Android Gingerbread, Froyo,...

A partir de Android 4.0 (Android ICS / 'Ice Cream Sandwich', Android 4.3 'Jelly Bean' y Android 4.4 'KitKat'), los certificados de confianza del sistema están en el sistema (de solo lectura) partición en la carpeta " /system/etc/security/' como archivos individuales. Sin embargo, los usuarios ahora pueden agregar fácilmente sus propios certificados de 'usuario' que se almacenarán en '/data/misc/keychain/certs-added'.

Los certificados instalados por el sistema se pueden administrar en el dispositivo Android en la sección Configuración- > Seguridad - > Certificados - > 'Sistema', mientras que los certificados de confianza del usuario se gestionan en la sección 'Usuario'. Al usar certificados de confianza de usuario, Android obligará al usuario de Android dispositivo para implementar medidas de seguridad adicionales: el uso de un código PIN, un bloqueo de patrón o una contraseña para desbloquear el dispositivo es obligatorio cuando se utilizan certificados suministrados por el usuario.

Instalar certificados CAcert como certificados 'user trusted'es muy fácil. Instalar nuevos certificados como 'system trusted' - certificates requiere más trabajo (y requiere acceso root), pero tiene la ventaja de evitar el requisito de pantalla de bloqueo de Android.

Desde Android N en adelante se pone un poco más difícil, ver este extracto del Sitio web de Charles proxy :

A partir de Android N, debe agregar configuración a su aplicación para haga que confíe en los certificados SSL generados por el proxy SSL de Charles. Esto significa que solo puede usar proxy SSL con aplicaciones que control.

Para configurar su aplicación para confiar en Charles, debe agregar un Archivo de configuración de seguridad de red para su aplicación. Este archivo puede anular el sistema predeterminado, lo que permite que la aplicación confíe en el usuario instalado Certificados de CA(por ejemplo, el Certificado Raíz de Charles). Puede especificar que esto solo se aplica en compilaciones de depuración de su aplicación, por lo que las compilaciones de producción utilizan el perfil de confianza predeterminado.

Agregue un archivo res/xml/network_security_config.xml a su aplicación:

<network-security-config>    
    <debug-overrides> 
        <trust-anchors> 
            <!-- Trust user added CAs while debuggable only -->
            <certificates src="user" /> 
        </trust-anchors>    
    </debug-overrides>  
</network-security-config>

Luego agregue una referencia a este archivo en el manifiesto de su aplicación, de la siguiente manera:

<?xml version="1.0" encoding="utf-8"?> 
<manifest>
    <application android:networkSecurityConfig="@xml/network_security_config">
    </application> 
</manifest>
 71
Author: Dean Wild,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-01 12:29:32

Pasé mucho tiempo tratando de encontrar una respuesta a esto (necesito Android para ver los certificados StartSSL). Conclusión: Android 2.1 y 2.2 le permiten importar certificados, pero solo para su uso con WiFi y VPN. No existe una interfaz de usuario para actualizar la lista de certificados raíz de confianza, pero se discute la posibilidad de agregar esa característica. No está claro si hay una solución confiable para actualizar y reemplazar manualmente los cacerts.archivo bks.

Detalles y enlaces: http://www.mcbsys.com/techblog/2010/12/android-certificates / . En esa publicación, vea el enlace al error de Android 11231 might es posible que desee agregar su voto y consulta a ese error.

 42
Author: Mark Berry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-22 02:42:23

Si necesita su certificado para conexiones HTTPS, puede agregar el .archivo bks como recurso sin procesar para su aplicación y extender DefaultHttpConnection para que sus certificados se utilicen para conexiones HTTPS.

public class MyHttpClient extends DefaultHttpClient {

    private Resources _resources;

    public MyHttpClient(Resources resources) {
        _resources = resources;
    }

    @Override
    protected ClientConnectionManager createClientConnectionManager() {
        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory
            .getSocketFactory(), 80));
        if (_resources != null) {
            registry.register(new Scheme("https", newSslSocketFactory(), 443));
        } else {
            registry.register(new Scheme("https", SSLSocketFactory
                .getSocketFactory(), 443));
        }
        return new SingleClientConnManager(getParams(), registry);
    }

    private SSLSocketFactory newSslSocketFactory() {
        try {
            KeyStore trusted = KeyStore.getInstance("BKS");
            InputStream in = _resources.openRawResource(R.raw.mystore);
            try {
                trusted.load(in, "pwd".toCharArray());
            } finally {
                in.close();
            }
            return new SSLSocketFactory(trusted);
        } catch (Exception e) {
            throw new AssertionError(e);
        }
    }
}
 15
Author: alexander.egger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-21 17:18:20

La guía enlazada aquí probablemente responderá a la pregunta original sin la necesidad de programar un conector SSL personalizado.

Encontramos una guía muy detallada sobre cómo importar certificados raíz que realmente lo guía a través de la instalación de certificados de CA de confianza en diferentes versiones de dispositivos Android (entre otros dispositivos).

Básicamente necesitarás:

  1. Descargar: los cacerts.archivo bks de su teléfono.

    Adb pull / system / etc / security / cacerts.bks cacerts.bks

  2. Descargar el .archivo crt de la autoridad certificadora que desea permitir.

  3. Modificar los cacerts.archivo bks en su computadora usando el Proveedor BouncyCastle

  4. Sube los cacerts.bks archivo de nuevo a su teléfono y reiniciar.

Aquí hay un paso más detallado a paso para actualizar los teléfonos Android anteriores: Cómo actualizar el almacén de claves de la autoridad de certificación de seguridad HTTPS en pre-android-4.0 dispositivo

 7
Author: RightHandedMonkey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-11 12:22:18

Lo que hice para poder usar certificados startssl fue bastante fácil. (en mi teléfono rooteado)

Copié /system/etc/security/cacerts.bks a mi tarjeta sd

Descargado http://www.startssl.com/certs/ca.crt y http://www.startssl.com/certs/sub.class1.server.ca.crt

Fue a portecle.sourceforge.net y ejecuté portecle directamente desde la página web.

Abrí mis cacerts.archivo bks de mi tarjeta sd (no ingresó nada cuando se le pidió un contraseña)

Elija importar en portacle y abra sub.class1.server.ca.crt, en mi caso ya tenía la ca.crt pero tal vez usted necesita para instalar que también.

Guardó el almacén de claves y lo copió baxck a /system/etc/security/cacerts.bks (Hice una copia de seguridad de ese archivo primero por si acaso)

Reinicié mi teléfono y ahora puedo ver mi sitio usando un certificado startssl sin errores.

 3
Author: hans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-18 06:56:48

Hay una solución mucho más fácil para esto que la publicada aquí, o en hilos relacionados. Si está utilizando una vista web (como yo), puede lograr esto ejecutando una función JAVASCRIPT dentro de ella. Si no está utilizando una vista web, es posible que desee crear una oculta para este propósito. Aquí hay una función que funciona en casi cualquier navegador (o webview) para iniciar la instalación de ca (generalmente a través del repositorio de cert del sistema operativo compartido, incluso en un Droid). Usa un buen truco con iFrames. Sólo pasa. la url de a .archivo crt para esta función:

function installTrustedRootCert( rootCertUrl ){
    id = "rootCertInstaller";
    iframe = document.getElementById( id );
    if( iframe != null ) document.body.removeChild( iframe );
    iframe = document.createElement( "iframe" );
    iframe.id = id;
    iframe.style.display = "none";
    document.body.appendChild( iframe );
    iframe.src = rootCertUrl;
}

ACTUALIZACIÓN:

El truco del iframe funciona en Droides con API 19 y superiores, pero las versiones anteriores de webview no funcionarán así. Sin embargo, la idea general todavía funciona: simplemente descargue/abra el archivo con una vista web y luego deje que el sistema operativo se haga cargo. Esta puede ser una solución más fácil y más universal (en el actual java now):

 public static void installTrustedRootCert( final String certAddress ){
     WebView certWebView = new WebView( instance_ );
     certWebView.loadUrl( certAddress );
 }

Tenga en cuenta que instance_ es una referencia a la Actividad. Esto funciona perfectamente si conoce la url a la cert. En mi caso, sin embargo, lo resuelvo dinámicamente con el software del lado del servidor. Tuve que agregar una buena cantidad de código adicional para interceptar una url de redirección y llamar a esto de una manera que no causó un accidente basado en una complicación de subproceso, pero no agregaré toda esa confusión aquí...

 3
Author: BuvinJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-12 21:33:14

Aquí hay una solución alternativa que realmente agrega su certificado a la lista integrada de certificados predeterminados: Confiar en todos los certificados usando HttpClient sobre HTTPS

Sin embargo, solo funcionará para su aplicación. No hay forma de hacerlo programáticamente para todas las aplicaciones en el dispositivo de un usuario, ya que eso sería un riesgo de seguridad.

 0
Author: emmby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:23