J'ai créé mon propre certificat de CA et je souhaite maintenant l'installer sur mon appareil Android Froyo (HTC Desire Z), afin que cet appareil approuve mon certificat.
Android stocke les certificats de l'autorité de certification dans son magasin de clés Java dans /system/etc/security/cacerts.bks
. J'ai copié le fichier sur mon ordinateur, ajouté mon certificat à l'aide de portecle 1.5 et l'a repoussé vers l'appareil.
Maintenant, Android ne semble pas recharger le fichier automatiquement. J'ai lu dans plusieurs articles de blog que j'ai besoin de redémarrer l'appareil. Si vous le faites, le fichier sera écrasé par celui d'origine.
Mon essai suivant consistait à installer le certificat de la carte SD en le copiant et en utilisant l'option correspondante du 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 magasin de clés sur mon ordinateur, je trouve toujours le stock d'origine cacerts.bks
.
Alors, quel est le bon moyen d'installer mon propre certificat d'autorité de certification racine sur un périphérique Android 2.2 en tant que certificat approuvé? Y at-il un moyen de le faire par programme?
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 été en mesure d'installer le certificat Charles Web Debbuging Proxy sur mon périphérique non root et de 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 n'y avait qu'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") approuvés par défaut sur Android. Les applications système et toutes les applications développées avec le Android SDK l'utilisent. Suivez ces instructions pour installer les certificats CAcert sur Android Gingerbread, Froyo, ...
À partir de Android 4.0 (Android ICS/'Sandwich à la crème glacée', Android 4.3 'Jelly bean' & Android 4.4 'KitKat'), les certificats de confiance du système sont sur la partition système (en lecture seule) du dossier '/ system/etc/security /' sous forme de fichiers individuels. Cependant, les utilisateurs peuvent désormais 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 le périphérique Android dans la section Paramètres -> Sécurité -> Certificats -> 'Système', tandis que les certificats de confiance de l'utilisateur y sont gérés. Lorsque vous utilisez des certificats de confiance utilisateur, Android obligera l'utilisateur du périphérique Android à prendre des mesures de sécurité supplémentaires: l'utilisation d'un code PIN, d'un verrouillage du schéma ou d'un mot de passe pour le déverrouiller. les périphériques sont obligatoires lorsque des certificats fournis par l'utilisateur sont utilisés.
L'installation de certificats CAcert en tant que certificats "de confiance d'utilisateurs" est très simple. L'installation de nouveaux certificats en tant que certificats 'de confiance du système' nécessite plus de travail (et nécessite un accès root), mais elle présente l'avantage d'éviter la configuration requise de Android lockscreen.
À partir de Android N , il devient un peu plus difficile. Voir cet extrait du site Web du proxy Charles :
À partir de Android N, vous devez ajouter une configuration à votre application afin de lui faire confiance pour les certificats SSL générés par Charles SSL Proxying. Cela signifie que vous ne pouvez utiliser le proxy SSL que pour les applications que vous contrôlez.
Afin de configurer votre application pour faire 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 à votre application d’approuver les certificats d’autorité de certification installés par l’utilisateur (par exemple, le certificat racine Charles). Vous pouvez spécifier que cela s'applique uniquement aux générations de débogage de votre application, afin que les générations 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>
J'ai passé beaucoup de temps à essayer de trouver une réponse à cette question (j'ai besoin de 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 la mise à jour de la liste des certificats racine approuvés, mais des discussions sont en cours sur l'ajout de 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, consultez le lien vers Android bogue 11231 - vous voudrez peut-être ajouter votre vote et votre requête à ce bogue.
Si vous avez besoin de votre certificat pour les connexions HTTPS, vous pouvez ajouter le fichier .bks en tant que ressource brute à votre application et étendre DefaultHttpConnection afin 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);
}
}
}
Le guide lié ici répondra probablement à la question initiale sans avoir à programmer un connecteur SSL personnalisé.
Vous trouverez un guide très détaillé sur l'importation de certificats racine qui vous guidera tout au long de l'installation de certificats d'autorité de certification approuvés sur différentes versions de Android appareils (entre autres).
Fondamentalement, vous devrez:
Télécharger: le fichier cacerts.bks de votre téléphone.
adb pull /system/etc/security/cacerts.bks cacerts.bks
Téléchargez le fichier .crt à partir de l'autorité de certification que vous souhaitez autoriser.
Modifiez le fichier cacerts.bks sur votre ordinateur à l’aide de BouncyCastle Provider
Transférez le fichier cacerts.bks sur votre téléphone et redémarrez.
Voici une procédure détaillée étape par étape pour mettre à jour les téléphones Androidprécédents: Comment mettre à jour le fichier de clés de l'autorité de certification HTTPS sur un périphérique antérieur à Android 4.
Il existe une solution BEAUCOUP plus facile à cela que celle affichée ici ou dans les discussions associées. Si vous utilisez une vue Web (telle que je suis), vous pouvez y parvenir en exécutant une fonction JAVASCRIPT. Si vous n'utilisez pas de vue Web, vous pouvez créer une vue masquée à cette fin. Voici une fonction qui fonctionne dans à peu près n'importe quel navigateur (ou vue Web) pour lancer l'installation (généralement via le référentiel de certificats OS partagé, y compris sur un Droid). Il utilise un bon truc avec iFrames. Il suffit de passer l'URL dans un fichier .crt à 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:
L'astuce iframe fonctionne sur les droïdes à partir de l'API 19, mais les versions antérieures de la vue Web ne fonctionneront pas de la sorte. L’idée générale fonctionne toujours cependant - il suffit de télécharger/ouvrir le fichier avec une Webview et de laisser l’OS prendre le relais. Cela peut être une solution plus simple 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 une référence à l'activité. Cela fonctionne parfaitement si vous connaissez l'URL du cert. Dans mon cas, cependant, je résous cela de manière dynamique 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 de manière à ne pas causer de plantage basé sur une complication de threading, mais je ne vais pas ajouter toute cette confusion ici ...
Ce que j'ai fait pour pouvoir utiliser les certificats de démarrage était assez facile. (sur mon téléphone enraciné)
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
Nous sommes allés à portecle.sourceforge.net et avons lancé portecle directement à partir de la page Web.
Ouvert mon fichier cacerts.bks de ma carte SD (rien entré quand demandé un mot de passe)
Choisissez importer dans portacle et ouvrez sub.class1.server.ca.crt, dans mon cas, il possédait déjà le ca.crt mais peut-être devez-vous également l’installer.
Sauvegardez le magasin de clés et copiez-le baxck dans /system/etc/security/cacerts.bks (j'ai d'abord fait une sauvegarde de ce fichier au cas où)
J'ai redémarré mon téléphone et je peux maintenant visiter mon site en utilisant un certificat de démarrage sans erreur.
Voici une solution alternative qui ajoute votre certificat à la liste intégrée des certificats par défaut: Faire confiance à tous les certificats utilisant HttpClient via HTTPS
Cependant, cela ne fonctionnera que pour votre application. Il n'y a aucun moyen de le faire par programme pour toutes les applications sur le périphérique d'un utilisateur, car cela présenterait un risque pour la sécurité.