
Ein "Plugin" für Android Java, um den Benutzer nach SSL-Zertifikaten zu fragen.
MemorizingTrustManager (MTM) ist ein Projekt, das einen intelligenteren und sichereren Einsatz von SSL auf Android ermöglicht. Wenn ein unbekanntes SSL-Zertifikat erkannt wird, fragt es den Benutzer, ob er das Zertifikat einmalig, dauerhaft akzeptieren oder die Verbindung abbrechen möchte. Dies ist ein Schritt zur Verhinderung von Man-in-the-Middle-Angriffen durch blindes Akzeptieren ungültiger, selbstsignierter und/oder abgelaufener Zertifikate.
MTM zielt darauf ab, eine nahtlose Integration in Ihre Android-Anwendung zu ermöglichen; der Quellcode ist unter der MIT-Lizenz verfügbar.

MemorizingTrustManager wird im yaxim XMPP client produktiv eingesetzt. Es ist nutzbar und einfach zu integrieren, unterstützt jedoch noch keine Hostnamen-Validierung (die Java-API macht die Integration schwierig).
MTM lässt sich einfach in Ihre eigene Anwendung integrieren. Folgen Sie diesen Schritten oder werfen Sie einen Blick in die Demo-Anwendung im Verzeichnis example.
Laden Sie den MTM-Quellcode von GitHub herunter oder fügen Sie ihn als git submodule hinzu:
# plain download:
git clone https://github.com/ge0rg/MemorizingTrustManager
# submodule:
git submodule add https://github.com/ge0rg/MemorizingTrustManager
Fügen Sie dann eine Bibliotheksprojekt-Abhängigkeit zu default.properties hinzu:
android.library.reference.1=MemorizingTrustManager
Bearbeiten Sie Ihre AndroidManifest.xml und fügen Sie das MTM-Activity-Element direkt vor dem Ende Ihres schließenden </application>-Tags ein.
...
<activity android:name="de.duenndns.ssl.MemorizingActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
/>
</application>
</manifest>
Einbinden von MemorizingTrustmanager in HTTPS-Verbindungen:
// 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()));
Für SSLSocket sollten Sie Folgendes tun:
// 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);
}
Oder für Smack können Sie setCustomSSLContext() verwenden:
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()));
Standardmäßig greift MTM auf den System-TrustManager zurück, bevor es den Benutzer fragt. Wenn Sie der Systemeinrichtung nicht vertrauen, können Sie einen Dialog bei jeder neuen Verbindung erzwingen, indem Sie dem Konstruktor einen Parameter defaultTrustManager = null übergeben:
MemorizingTrustManager mtm = new MemorizingTrustManager(this, null);
Wenn Sie einen anderen zugrunde liegenden TrustManager verwenden möchten, z. B. AndroidPinning, übergeben Sie diesen einfach an den MTM-Konstruktor:
X509TrustManager pinning = new PinningTrustManager(SystemKeyStore.getInstance(),
new String[] {"f30012bbc18c231ac1a44b788e410ce754182513"}, 0);
MemorizingTrustManager mtm = new MemorizingTrustManager(this, pinning);
MTM verwendet java.util.logging (JUL) für Protokollierungszwecke. Wenn Sie keinen Handler für JUL konfiguriert haben, protokolliert Android standardmäßig alle Meldungen der Stufe Level.INFO oder höher. Um auch die Debug-Protokollmeldungen (Stufe Level.FINE oder niedriger) zu erhalten, müssen Sie einen entsprechenden Handler konfigurieren. Das MTM-Beispielprojekt enthält de.duenndns.mtmexample.JULHandler, mit dem die Debug-Protokollierung zur Laufzeit aktiviert und deaktiviert werden kann.
MemorizingTrustManager ist nicht der einzige seiner Art.
NetCipher ist eine Android-Bibliothek des Guardian Project zur Verbesserung der Netzwerksicherheit für mobile Apps. Sie enthält einen StrongTrustManager für gründlichere Zertifikatsprüfungen, einen unabhängigen Root-CA-Speicher sowie Code, um Ihren Datenverkehr einfach über das Tor-Netzwerk mit Orbot zu leiten.
AndroidPinning ist eine weitere Android-Bibliothek, geschrieben von Moxie Marlinspike, mit der Serverzertifikate festgelegt (gepinnt) werden können, um die Sicherheit gegen staatliche MitM-Angriffe zu verbessern. Verwenden Sie diese, wenn Ihre App für die Kommunikation mit einem bestimmten Server entwickelt wurde!
Bitte helfen Sie mit, MTM in weitere Sprachen zu übersetzen!