Dans cet article, nous allons voir comment importer un certificat auto-signé dans votre application pour réaliser une connexion SSL sécurisée à l’aide de Bouncy Castle.

Android possède un Keystore contenant toutes les clés publiques certifiées par Google.  Si vous tentez de faire une requête HTTPS depuis votre application sur un site ayant un certificat auto-signé, il y a de fortes chances qu’elle soit refusée. Voici comment ajouter un certificat auto-signé à votre application.

BouncyCastle Provider

Pour commencer, vous devez télécharger BouncyCastle Provider disponible ici (un fichier jar) et le placer dans un dossier que vous saurez retrouver ensuite.

Récupérer les certificats

Depuis un navigateur comme Chrome ou Firefox, rien de plus simple:

  • depuis une page de votre site : clic droit/afficher les informations.
  • Ensuite exportez le certificat au format .cer. Dans le cas où vous avez une chaine de certificat, toute la chaine est nécessaire.

Création du keystore

Ouvrez une fenêtre en ligne de commande. Il faut que vous vous trouviez dans le dossier …/Java/jre/bin pour pouvoir utiliser l’outil keytool. Pour cela, tapez “cd chemin_vers_java/Java/jre/bin”. Tapez ensuite la commande suivante:

keytool -importcert -v -trustcacerts -file "chemin_vers_le_certificat/moncertificat.cer" -alias IntermediateCA -keystore "chemin_nouveau_keystore/myKeystore.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "chemin_vers_bouncycastle/bcprov-jdk16-146.jar" -storetype BKS -storepass monmotdepasse

Un message doit normalement vous dire “Un certificat a été ajouté au keystore

NOTE : si vous avez une chaine de certificats, commencez par le certificat le plus bas et remontez ensuite vers le certificat racine.

La commande suivante permet de vérifier que le certificat a été ajouté :

keytool -list -keystore " chemin_nouveau_keystore/myKeystore.bks" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath " chemin_vers_bouncycastle /bcprov-jdk16-145.jar" -storetype BKS -storepass monmotdepasse

NOTE : le mot de passe (storepass) servira lors de chaque ouverture de notre keystore.

Si le certificat a été ajouté, vous aurez un message de ce genre:

IntermediateCA, 22.10.2010, trustedCertEntry, Thumbprint (MD5): 98:0F:C3:F8:39:F7:D8:05:07:02:0D:E3:14:5B:29:43

Vous devez ensuite ajouter le keystore créé dans les ressources du projet, dans le dossier res/raw.

Création d’une classe HTTP personnalisée

Créez ensuite une nouvelle classe nommée “MyHttpClient“. Cette classe dérivera de la classe DefaultHttpClient définie par Android et utilisera le keystore créé précédemment.

public class MyHttpClient extends DefaultHttpClient {
 final Context context;
 public MyHttpClient(Context context) {
  this.context = context;
 }

 @Override
 protected ClientConnectionManager createClientConnectionManager() {
  SchemeRegistry registry = new SchemeRegistry();
  //Pour les requêtes HTTP, on laisse la classe de base s'en occuper.
  registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
  // Les requêtes HTTPS se font sur le port 443. A chaque connexion HTTPS, c’est notre keystore qui sera utilisé.
  registry.register(new Scheme("https", newSslSocketFactory(), 443));
  return new SingleClientConnManager(getParams(), registry);
 }

 private SSLSocketFactory newSslSocketFactory() {
  try {
  // On obtient une instance de notre KeyStore
  trusted = KeyStore.getInstance("BKS");
  InputStream in = context.getResources().openRawResource(R.raw.mykeystore);
   try {
    // Initialisation de notre keystore. On entre le mot de passe (storepass)
    trusted.load(in, "monmotdepasse".toCharArray());
    } finally {
   in.close();
   }

  // Passons le keystore au SSLSocketFactory qui est responsable de la verification du certificat
  SSLSocketFactory sf = new SSLSocketFactory(trusted);
  sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
  return sf;
  } catch (Exception e) {
   throw new AssertionError(e);
  }
 }
}

On utilise ensuite cette classe comme la classe HTTP de base d’Android:

DefaultHttpClient client = new MyHttpClient(getApplicationContext()); HttpGet get = new HttpGet("https://monsitesecurise.com");

Conclusion

Voilà le tutoriel est terminé, en espérant que vous ayez compris comment ajouter vos propres certificats.

Categories: Tutoriels

17 Responses so far.


  1. DAILOS dit :

    Salut,
    j’ai tester ce code mais j’ai un soucis avec cette ligne :

    HttpClient client =new MyHttpClient(getApplicationContext());

    et l’erreur sa vient de :

    getApplicationContext()

    The method getApplicationContext() is undefined for the type

Leave a Reply


Notifiez-moi des commentaires à venir via email. Vous pouvez aussi vous abonner sans commenter.