Comment installer un certificat CA fiable 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), de sorte que l'appareil fait confiance à mon certificat.

Android stocke les certificats CA dans son Java keystore dans /system/etc/security/cacerts.bks . J'ai copié le fichier sur mon ordinateur, j'ai ajouté mon certificat en utilisant portecle 1.5 et je l'ai repoussé vers l'appareil.

Maintenant, Android ne semble pas recharger le fichier automatiquement. J'ai lu dans plusieurs billets de blog que je dois redémarrer l'appareil. Ainsi, le fichier est de nouveau écrasé par le fichier original.

mon prochain essai était d'installer le certificat à partir de la carte SD en le copiant et en utilisant l'option correspondante du menu Paramètres. L'appareil me dit que le certificat a été installé, mais apparemment il ne fait pas confiance au certificat. En outre, quand j'essaie de copier le keystore sur mon ordinateur, je trouve toujours le stock d'origine cacerts.bks .

alors, quelle est la bonne façon d'installer mon propre certificat de CA racine sur un appareil Android 2.2 en tant que certificat de confiance? Est-il un moyen de le faire par programmation?

105
demandé sur Björn Marschollek 2010-12-16 16:44:36

7 réponses

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

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

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

avant Android version 4.0, avec Android version Gingerbread & Froyo, il y avait un seul fichier en lecture seule ( /system/etc/security/cacerts.bks) contenant le magasin de confiance avec tous les certificats CA ("système") auxquels on fait confiance 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 sur l'installation des certificats CAcert sur Android Gingerbread, Froyo,...

à partir de Android 4.0 (Android ICS / 'Ice Cream Sandwich', Android 4.3 'Jelly Bean' & Android 4.4' KitKat'), les certificats de confiance système sont sur la partition système (en lecture seule) dans le dossier' /system/etc/security/ ' sous forme de fichiers individuels. Toutefois, les utilisateurs peuvent facilement ajouter leurs propres "utilisateur" ou "certificats qui seront stockés dans/data/misc/keychain/certs ajoutée".

certificats installés sur le système peuvent être gérés sur L'appareil Android dans les paramètres - > sécurité - > Certificats- > 'système' - section, alors que l'utilisateur de confiance les certificats sont placés dans la section "Utilisateur". Lors de l'utilisation de certificats de confiance des utilisateurs, Android forcera L'utilisateur de L'appareil Android à mettre en œuvre des mesures de sécurité supplémentaires: l'utilisation d'un code PIN, d'un pattern-lock ou d'un mot de passe pour déverrouiller l'appareil sont obligatoires lorsque les certificats fournis par l'utilisateur sont utilisés.

installer les certificats CAcert comme 'user trusted' - certificats est très facile. Installer de nouveaux certificats en tant que'system trusted' -les certificats nécessitent plus de travail (et nécessite un accès root), mais il a l'avantage d'éviter le lockscreen Android exigence.

à partir de Android N it gets a littler harder, voir cet extrait du site Charles proxy :

à partir D'Android N, vous devez ajouter une configuration à votre application afin de ayez confiance dans les certificats SSL générés par Charles SSL Proxying. Cela signifie que vous ne pouvez utiliser SSL Proxying qu'avec des applications que vous contrôle.

afin de configurer votre application pour faire confiance à Charles, vous devez ajouter un Fichier de Configuration de la sécurité réseau de votre application. Ce fichier peut Outrepasser le système par défaut, permettant à votre application de faire confiance à l'utilisateur installé Certificats de L'AC (p. ex. le certificat Charles Root). Vous pouvez spécifier que ceci s'applique seulement dans les constructions de debug de votre application, de sorte que les constructions de production utilisent le profil de confiance par défaut.

Ajouter 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>

puis Ajouter 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>
71
répondu Dean Wild 2018-03-01 12:29:32

j'ai passé beaucoup de temps à essayer de trouver une réponse à cela (J'ai besoin D'Android pour voir les certificats StartSSL). Conclusion: Android 2.1 et 2.2 vous permettent d'importer des certificats, mais uniquement pour une utilisation avec WiFi et VPN. Il n'y a pas d'interface utilisateur pour mettre à jour la liste des certificats racine de confiance, mais il y a une discussion sur l'ajout de cette fonctionnalité. Il n'est pas clair s'il existe une solution de rechange fiable pour mettre à jour et remplacer manuellement les cacerts.dossier bks.

détails et liens: http://www.mcbsys.com/techblog/2010/12/android-certificates / . Dans ce post, voir le lien vers Android bogue 11231--vous pourriez vouloir ajouter votre vote et requête à ce bogue.

42
répondu Mark Berry 2010-12-22 02:42:23

si vous avez besoin de votre certificat pour les connexions HTTPS, vous pouvez ajouter le .BKS fichier comme une ressource brute à votre application et étendre DefaultHttpConnection de sorte que vos certificats sont 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);
        }
    }
}
15
répondu alexander.egger 2012-12-21 17:18:20

Le guide liés ici sera sans doute la réponse à la question d'origine, sans la nécessité pour la programmation d'une SSL personnalisé connecteur.

a trouvé un guide très détaillé sur l'importation de certificats racine qui vous guide à travers l'installation de certificats CA fiables sur différentes versions D'appareils Android (entre autres appareils).

en gros, vous aurez besoin de:

  1. Téléchargement: le fichier cacerts.le fichier bks de votre téléphone.

    ADB pull/system/etc/security / cacerts.BKS cacerts.bks

  2. Téléchargez le .crt file de l'autorité de certification que vous voulez autoriser.

  3. Modifier les cacerts.BKS fichier sur votre ordinateur en utilisant le BouncyCastle Fournisseur

  4. Télécharger le fichier cacerts.bks fichier vers votre téléphone et redémarrez.

Voici une étape plus détaillée par étape pour mettre à jour les téléphones android plus tôt: comment mettre à jour HTTPS security certificate authority keystore sur pre-android-4.0 device

7
répondu RightHandedMonkey 2015-02-11 12:22:18

ce que j'ai fait pour pouvoir utiliser les certificats startssl était assez facile.

j'ai copié / system/etc/security / cacerts.bks à ma sdcard

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

est allé à portecle.sourceforge.net et a lancé portecle directement à partir de la page web.

a ouvert mes cacerts.fichier bks de ma carte sdcard (entré rien Quand demandé pour un mot de passe)

choisir importation dans le portacle et ouvert sub.classe1.serveur.ca.crt, je suis sur mon cas il avait déjà le ca.crt mais peut-être que vous avez besoin d'installer cela aussi.

a sauvegardé le keystore et l'a copié sur /system/etc/security/cacerts.bks (j'ai fait une sauvegarde de ce fichier au cas où)

a redémarré mon téléphone et maintenant je peux visiter mon site thats utiliser un certificat startssl sans erreur.

3
répondu hans 2012-04-18 06:56:48

il y a une solution beaucoup plus facile à cela que affiché ici, ou dans les fils connexes. Si vous utilisez un webview (comme je le suis), vous pouvez y parvenir en exécutant une fonction JAVASCRIPT. Si vous n'utilisez pas webview, vous pourriez vouloir en créer un caché à cette fin. Voici une fonction qui fonctionne dans à peu près n'importe quel navigateur (ou webview) pour démarrer l'installation de ca (généralement par le biais du dépôt partagé OS cert, y compris sur un Droid). Il utilise un bon truc avec iFrames. Il suffit de passer l'url de l' .crt file à cette fonction:

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;
}

mise à jour:

le truc iframe fonctionne sur Droids avec API 19 et plus, mais les anciennes versions de webview ne fonctionneront pas comme ça. L'idée générale fonctionne toujours cependant - il suffit de télécharger / ouvrir le fichier avec un webview et ensuite laisser le système d'exploitation prendre le relais. Cela peut être une solution plus facile et plus universelle (dans le java actuel):

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

Notez que instance_ est un référence à l'Activité. Cela fonctionne parfaitement si vous connaissez l'url du cert. Dans mon cas, cependant, je résous cela dynamiquement avec le logiciel côté serveur. J'ai dû ajouter une bonne quantité de code supplémentaire pour intercepter une url de redirection et l'appeler d'une manière qui n'a pas causé un crash basé sur une complication de threading, mais je ne vais pas ajouter toute cette confusion ici...

3
répondu BuvinJ 2015-03-12 21:33:14

Voici une solution alternative qui ajoute en fait votre certificat à la liste intégrée des certificats par défaut: faire confiance à tous les certificats en utilisant HttpClient sur HTTPS

cependant, il ne fonctionnera que pour votre application. Il n'y a aucun moyen de le faire programmatiquement pour toutes les applications sur l'appareil d'un utilisateur, car ce serait un risque de sécurité.

0
répondu emmby 2017-05-23 12:26:23