
Un « plugin » pour Android Java permettant d'interroger l'utilisateur au sujet des certificats SSL.
MemorizingTrustManager (MTM) est un projet visant à permettre une utilisation plus intelligente et plus sûre de SSL sur Android. S'il rencontre un certificat SSL inconnu, il demande à l'utilisateur d'accepter le certificat une fois, de manière permanente ou d'interrompre la connexion. Il s'agit d'une étape dans la prévention des attaques de l'homme du milieu, en évitant d'accepter aveuglément tout certificat invalide, auto-signé et/ou expiré.
MTM vise à fournir une intégration transparente dans votre application Android, et le code source est disponible sous licence MIT.

MemorizingTrustManager est utilisé en production dans le client XMPP yaxim. Il est utilisable et facile à intégrer, même s'il ne prend pas encore en charge la validation du nom d'hôte (l'API Java rend son intégration difficile).
MTM est facile à intégrer dans votre propre application. Suivez ces étapes ou jetez un œil à l'application de démonstration dans le répertoire example.
Téléchargez le code source de MTM depuis GitHub ou ajoutez-le comme sous-module git :
# plain download:
git clone https://github.com/ge0rg/MemorizingTrustManager
# submodule:
git submodule add https://github.com/ge0rg/MemorizingTrustManager
Ajoutez ensuite une dépendance de projet de bibliothèque à default.properties :
android.library.reference.1=MemorizingTrustManager
Modifiez votre AndroidManifest.xml et ajoutez l'élément d'activité MTM juste avant la fin de votre balise </application> fermante.
...
<activity android:name="de.duenndns.ssl.MemorizingActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
/>
</application>
</manifest>
Brancher MemorizingTrustManager dans les connexions HTTPS :
// register MemorizingTrustManager for HTTPS
SSLContext sc = SSLContext.getInstance("TLS");
MemorizingTrustManager mtm = new MemorizingTrustManager(this);
sc.init(null, new X509TrustManager[] { mtm }, new java.security.SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier(
mtm.wrapHostnameVerifier(HttpsURLConnection.getDefaultHostnameVerifier()));
Pour SSLSocket, vous devez procéder comme suit :
// register MemorizingTrustManager for all SSLSockets
SSLContext sc = SSLContext.getInstance("TLS");
MemorizingTrustManager mtm = new MemorizingTrustManager(this);
HostnameVerifier hv = mtm.wrapHostnameVerifier(new org.apache.http.conn.ssl.StrictHostnameVerifier());
sc.init(null, new X509TrustManager[] { mtm }, new java.security.SecureRandom());
SSLContext.setDefault(sc);
// connect a socket
SSLSocket s = ...;
s.startHandshake();
if (!hv.verify(your_domain_name, sslSocket.getSession())) {
throw new CertificateException("Server failed to authenticate as " + your_domain_name);
}
Ou, pour Smack, vous pouvez utiliser setCustomSSLContext() :
org.jivesoftware.smack.ConnectionConfiguration connectionConfiguration = …
SSLContext sc = SSLContext.getInstance("TLS");
MemorizingTrustManager mtm = new MemorizingTrustManager(this);
sc.init(null, new X509TrustManager[] { mtm }, new java.security.SecureRandom());
connectionConfiguration.setCustomSSLContext(sc);
connectionConfiguration.setHostnameVerifier(
mtm.wrapHostnameVerifier(new org.apache.http.conn.ssl.StrictHostnameVerifier()));
Par défaut, MTM revient au TrustManager système avant de demander à l'utilisateur. Si vous ne faites pas confiance à l'établissement, vous pouvez imposer une boîte de dialogue pour chaque nouvelle connexion en fournissant un paramètre defaultTrustManager = null au constructeur :
MemorizingTrustManager mtm = new MemorizingTrustManager(this, null);
Si vous souhaitez utiliser un TrustManager sous-jacent différent, comme AndroidPinning, fournissez-le simplement au constructeur de MTM :
X509TrustManager pinning = new PinningTrustManager(SystemKeyStore.getInstance(),
new String[] {"f30012bbc18c231ac1a44b788e410ce754182513"}, 0);
MemorizingTrustManager mtm = new MemorizingTrustManager(this, pinning);
MTM utilise java.util.logging (JUL) à des fins de journalisation. Si vous n'avez pas configuré de Handler pour JUL, Android journalisera par défaut tous les messages de niveau INFO ou supérieur. Pour obtenir également les messages de journalisation de débogage (ceux de niveau FINE ou inférieur), vous devez configurer un Handler en conséquence. Le projet d'exemple MTM contient de.duenndns.mtmexample.JULHandler, qui permet d'activer et de désactiver la journalisation de débogage à l'exécution.
MemorizingTrustManager n'est pas le seul outil existant.
NetCipher est une bibliothèque Android créée par le Guardian Project pour améliorer la sécurité réseau des applications mobiles. Elle est livrée avec un StrongTrustManager pour effectuer des vérifications de certificats plus approfondies, un magasin de CA racines indépendant et du code pour acheminer facilement votre trafic via le réseau Tor en utilisant Orbot.
AndroidPinning est une autre bibliothèque Android, écrite par Moxie Marlinspike pour permettre l'épinglage des certificats de serveurs, améliorant ainsi la sécurité contre les attaques MitM à l'échelle gouvernementale. Utilisez-la si votre application est conçue pour communiquer avec un serveur spécifique !