156 votes

Comment installer un certificat CA de confiance sur un appareil Android ?

J'ai créé mon propre certificat CA et maintenant je veux l'installer sur mon appareil Android Froyo (HTC Desire Z), afin que l'appareil fasse confiance à mon certificat.

Android stocke les certificats d'autorité de certification dans son keystore Java en /system/etc/security/cacerts.bks . J'ai copié le fichier sur mon ordinateur, ajouté mon certificat à l'aide de la fonction portecle 1.5 et l'a repoussé sur l'appareil.

Maintenant, Android ne semble pas recharger le fichier automatiquement. J'ai lu dans plusieurs articles de blog que je devais redémarrer l'appareil. Ce faisant, le fichier est à nouveau écrasé par le fichier d'origine.

J'ai ensuite essayé d'installer le certificat à partir de la carte SD en le copiant et en utilisant l'option correspondante dans le menu des paramètres. L'appareil me dit que le certificat a été installé, mais apparemment il ne fait pas confiance au certificat. De plus, lorsque j'essaie de copier le keystore sur mon ordinateur, je trouve toujours le stock original. cacerts.bks .

Alors, quelle est la bonne façon d'installer mon propre certificat Root CA sur un appareil Android 2.2 comme certificat de confiance ? Existe-t-il un moyen de le faire de manière programmatique ?

0 votes

Vous pouvez supposer que vous avez un téléphone rooté ici :)

135voto

Dean Wild Points 1332

Avant Android KitKat, vous devez rooter votre appareil pour installer de nouveaux certificats.

De Android KitKat (4.0) à Nougat (7.0) c'est possible et facile. J'ai pu installer le Charles Web Debbuging Proxy cert sur mon appareil non rooté et renifler avec succès le trafic SSL.

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

Avant la version 4.0 d'Android, avec les versions Gingerbread et Froyo, il existait un seul fichier en lecture seule ( /system/etc/security/cacerts.bks ) contenant le magasin de confiance avec tous les certificats de l'autorité de certification ("système") reconnus par défaut sur Android. Les applications système et toutes les applications développées avec le SDK Android l'utilisent. Utilisez ces instructions pour installer les certificats CAcert sur Android Gingerbread, Froyo, ...

Depuis Android 4.0 (Android ICS/'Ice Cream Sandwich', Android 4.3 'Jelly Bean' et Android 4.4 'KitKat'), les certificats de confiance du système se trouvent sur la partition système (en lecture seule) dans le dossier '/system/etc/security/' sous forme de fichiers individuels. Cependant, les utilisateurs peuvent maintenant facilement ajouter leurs propres certificats "utilisateur" qui seront stockés dans "/data/misc/keychain/certs-added".

Les certificats installés par le système peuvent être gérés sur l'appareil Android dans Paramètres -> Sécurité -> Certificats -> section "Système", tandis que les certificats de confiance de l'utilisateur sont gérés dans la section "Utilisateur". Lorsqu'il utilise des certificats approuvés par l'utilisateur, Android oblige l'utilisateur de l'appareil Android à mettre en œuvre des mesures de sécurité supplémentaires : l'utilisation d'un code PIN, d'un verrouillage par motif ou d'un mot de passe pour déverrouiller l'appareil est obligatoire lorsque des certificats fournis par l'utilisateur sont utilisés.

Il est très facile d'installer des certificats CAcert en tant que certificats de confiance pour l'utilisateur. L'installation de nouveaux certificats en tant que certificats "system trusted" demande plus de travail (et nécessite un accès Root), mais elle a l'avantage d'éviter l'exigence de l'écran de verrouillage Android.

À partir d'Android N cela devient un peu plus difficile, voir cet extrait de la Site web de la procuration Charles :

A partir d'Android N, vous devez ajouter une configuration à votre application afin de qu'elle fasse confiance aux certificats SSL générés par Charles SSL Proxying. Cela signifie que vous pouvez uniquement utiliser le proxy SSL avec les applications que vous contrôlez.

Afin de configurer votre application pour qu'elle fasse confiance à Charles, vous devez ajouter un fichier de configuration de la sécurité réseau à votre application. Ce fichier peut remplacer la valeur par défaut du système, permettant ainsi à votre application de faire installés par l'utilisateur (par exemple, le certificat racine de Charles). Vous pouvez spécifier que cela ne s'applique qu'aux constructions de débogage de votre application, de sorte que les versions de production utilisent le profil de confiance par défaut.

Ajoutez un fichier res/xml/network_security_config.xml à votre application :

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

Ajoutez ensuite une référence à ce fichier dans le manifeste de votre application, comme suit :

<?xml version="1.0" encoding="utf-8"?> 
<manifest>
    <application android:networkSecurityConfig="@xml/network_security_config">
    </application> 
</manifest>

2 votes

Mes fichiers de certificat personnalisés ( /system/etc/security/cacerts/*.0 ) ne sont pas conservés après le redémarrage de l'AVD, cette solution n'a donc pas fonctionné.

0 votes

@BornToCode intéressant - j'utilise rarement les AVD donc je n'étais pas au courant de cette limitation.

0 votes

Je vois le décor debug-overrides cela signifie-t-il que cette network_security_config en ciblant uniquement la variante de débogage ? Si j'ai une autre variante comme la variante UAT, cela ne fonctionnera pas ?

44voto

Mark Berry Points 3154

J'ai passé beaucoup de temps à essayer de trouver une réponse à ce problème (j'ai besoin qu'Android puisse voir les certificats StartSSL). Conclusion : Android 2.1 et 2.2 vous permettent d'importer des certificats, mais uniquement pour une utilisation avec le WiFi et le VPN. Il n'y a pas d'interface utilisateur pour mettre à jour la liste des certificats racine de confiance, mais il est question d'ajouter cette fonctionnalité. Il n'est pas clair s'il existe une solution de contournement fiable pour mettre à jour et remplacer manuellement le fichier cacerts.bks.

Détails et liens : http://www.mcbsys.com/techblog/2010/12/Android-certificates/ . Dans cet article, vous trouverez le lien vers le bogue Android 11231 - vous pouvez ajouter votre vote et votre requête à ce bogue.

3 votes

Un développeur Android a répondu à ma question concernant la mise à jour de cacerts.bks : "Dans toutes les versions, sauf la 2.3, un OTA est nécessaire pour mettre à jour le cacerts.bks sur un téléphone non rooté." code.google.com/p/Android/issues/detail?id=11231#c25 . OTA= over-the-air, c'est ça ? Cela pourrait-il être la raison pour laquelle votre téléphone continue de revenir aux cacerts.bks d'usine ? Cependant, si vous avez un accès Root, il semble que vous devriez être en mesure de télécharger le code source, ajouter votre cert, puis construire cacerts.bks en utilisant le certimport.sh script. Android.git.kernel.org/?p=platform/libcore.git;a=tree;f=luni/ .

0 votes

Merci. Ce n'était évidemment pas la réponse que je voulais entendre, mais il semble que ce soit la bonne. J'espérais qu'il y avait un moyen d'installer un certificat sans mettre à jour l'ensemble du système. Je peux bien sûr construire le nouveau cacerts.bks, avec l'accès Root je peux même remplacer l'ancien, mais il revient à la version originale à chaque redémarrage. Sans redémarrage, Android semble refuser de recharger le fichier des certificats de confiance.

27 votes

Qu'en est-il de l'installation des certificats CA sur les plateformes 3.X et 4.X ?

17voto

alexander.egger Points 1330

Si vous avez besoin de votre certificat pour les connexions HTTPS, vous pouvez ajouter le fichier .bks comme ressource brute à votre application et étendre DefaultHttpConnection pour que vos certificats soient utilisés pour les connexions 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);
        }
    }
}

0 votes

Merci pour votre réponse. En fait, j'ai besoin d'installer le certificat d'une manière telle que chaque application sur l'appareil fasse confiance au certificat. Le même problème devrait également se poser pour certaines petites autorités de certification comme CAcert, dont les certificats ne sont pas reconnus par défaut. Comment font-ils pour installer leurs certificats ?

0 votes

Avez-vous essayé : Paramètres -> Sécurité -> Installer à partir de la carte SD

0 votes

Ceci pourrait également être intéressant : Android.git.kernel.org/?p=platform/packages/apps/

10voto

RightHandedMonkey Points 614

Le guide lié ici répondra probablement à la question initiale sans qu'il soit nécessaire de programmer un connecteur SSL personnalisé.

J'ai trouvé un guide pratique très détaillé sur l'importation de certificats racine qui vous guide dans l'installation de certificats d'autorité de certification de confiance sur différentes versions d'appareils Android (entre autres).

En gros, vous aurez besoin de :

  1. Téléchargez : le fichier cacerts.bks depuis votre téléphone.

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

  2. Téléchargez le fichier .crt de l'autorité de certification que vous souhaitez autoriser.

  3. Modifiez le fichier cacerts.bks sur votre ordinateur à l'aide de l'utilitaire Fournisseur de châteaux gonflables

  4. Rechargez le fichier cacerts.bks sur votre téléphone et redémarrez.

Voici un pas à pas plus détaillé pour mettre à jour les téléphones Android antérieurs : Comment mettre à jour le keystore de l'autorité de certification de sécurité HTTPS sur un appareil pré-Android-4.0 ?

3voto

hans Points 21

Ce que j'ai fait pour pouvoir utiliser les certificats startssl était assez facile. (sur mon téléphone rooté)

J'ai copié /system/etc/security/cacerts.bks sur ma carte SD.

Téléchargé http://www.startssl.com/certs/ca.crt et http://www.startssl.com/certs/sub.class1.server.ca.crt

Je suis allé sur portecle.sourceforge.net et j'ai exécuté portecle directement depuis la page web.

J'ai ouvert mon fichier cacerts.bks à partir de ma carte SD (je n'ai rien entré quand on m'a demandé un mot de passe).

Choisissez import dans portacle et ouvrez sub.class1.server.ca.crt, dans mon cas il y avait déjà le ca.crt mais vous devez peut-être l'installer aussi.

Sauvegardez le keystore et copiez-le baxck dans /system/etc/security/cacerts.bks (j'ai fait une sauvegarde de ce fichier avant, juste au cas où).

J'ai redémarré mon téléphone et maintenant je peux visiter mon site qui utilise un certificat startssl sans erreurs.

0 votes

0 votes

Une idée de comment remettre le cacert.bks sur un appareil NON rooté ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X