
Un "plugin" per Android Java per consentire di chiedere all'utente informazioni sui certificati SSL
MemorizingTrustManager (MTM) è un progetto per abilitare un uso più intelligente e sicuro di SSL su Android. Se incontra un certificato SSL sconosciuto, chiede all'utente se accettare il certificato una volta, permanentemente, o se interrompere la connessione. Questo è un passo nella prevenzione degli attacchi man-in-the-middle basati sull'accettazione cieca di certificati non validi, autofirmati e/o scaduti.
MTM mira a fornire un'integrazione senza soluzione di continuità nella tua applicazione Android, e il codice sorgente è disponibile sotto licenza MIT.

MemorizingTrustManager è in uso in produzione nel client XMPP yaxim. È utilizzabile e facile da integrare, anche se non supporta ancora la validazione del nome host (l'API Java rende difficile l'integrazione).
MTM è facile da integrare nella tua applicazione. Segui questi passaggi oppure dai un'occhiata all'applicazione demo nella directory example.
Scarica il sorgente di MTM da GitHub, oppure aggiungilo come sottomodulo git:
# plain download:
git clone https://github.com/ge0rg/MemorizingTrustManager
# submodule:
git submodule add https://github.com/ge0rg/MemorizingTrustManager
Poi aggiungi una dipendenza di progetto libreria a default.properties:
android.library.reference.1=MemorizingTrustManager
Modifica il tuo AndroidManifest.xml e aggiungi l'elemento activity di MTM subito prima della fine del tuo tag </application> di chiusura.
...
<activity android:name="de.duenndns.ssl.MemorizingActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
/>
</application>
</manifest>
Collegamento di MemorizingTrustManager nelle connessioni 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()));
Per SSLSocket dovresti fare quanto segue:
// 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);
}
Oppure, per Smack puoi usare 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()));
Di default, MTM ripiega sul TrustManager di sistema prima di chiedere all'utente. Se non ti fidi dell'establishment, puoi imporre una finestra di dialogo a ogni nuova connessione fornendo un parametro defaultTrustManager = null al costruttore:
MemorizingTrustManager mtm = new MemorizingTrustManager(this, null);
Se vuoi usare un TrustManager sottostante diverso, come AndroidPinning, fornisci semplicemente quello al costruttore di MTM:
X509TrustManager pinning = new PinningTrustManager(SystemKeyStore.getInstance(),
new String[] {"f30012bbc18c231ac1a44b788e410ce754182513"}, 0);
MemorizingTrustManager mtm = new MemorizingTrustManager(this, pinning);
MTM usa java.util.logging (JUL) per scopi di logging. Se non hai configurato un Handler per JUL, Android registrerà di default tutti i messaggi di Level.INFO o superiore. Per ottenere anche i messaggi di log di debug (quelli con Level.FINE o inferiore) devi configurare un Handler di conseguenza. Il progetto di esempio di MTM contiene de.duenndns.mtmexample.JULHandler, che consente di abilitare e disabilitare il logging di debug a runtime.
MemorizingTrustManager non è l'unico in circolazione.
NetCipher è una libreria Android realizzata dal Guardian Project per migliorare la sicurezza di rete delle app mobili. Include uno StrongTrustManager per effettuare controlli dei certificati più approfonditi, un archivio di CA root indipendente e codice per instradare facilmente il tuo traffico attraverso la rete Tor usando Orbot.
AndroidPinning è un'altra libreria Android, scritta da Moxie Marlinspike per consentire il pinning dei certificati del server, migliorando la sicurezza contro attacchi MitM su scala governativa. Usala se la tua app è progettata per comunicare con un server specifico!
Per favore, aiuta a tradurre MTM in più lingue!