
Un "plugin" para Android Java que permite preguntar al usuario sobre certificados SSL.
MemorizingTrustManager (MTM) es un proyecto para permitir un uso de SSL en Android más inteligente y seguro. Si encuentra un certificado SSL desconocido, pregunta al usuario si desea aceptar el certificado una vez, permanentemente o abortar la conexión. Esto es un paso para prevenir ataques de hombre en el medio al aceptar ciegamente certificados inválidos, autofirmados y/o caducados.
MTM está pensado para proporcionar una integración perfecta en tu aplicación Android, y el código fuente está disponible bajo la licencia MIT.

MemorizingTrustManager está en uso de producción en el cliente XMPP yaxim. Es utilizable y fácil de integrar, aunque todavía no soporta la validación de nombre de host (la API de Java hace que sea difícil de integrar).
MTM es fácil de integrar en tu propia aplicación. Sigue estos pasos o echa
un vistazo a la aplicación de demostración en el directorio example.
Descarga el código fuente de MTM desde GitHub, o añádelo como un submódulo de git:
# descarga directa:
git clone https://github.com/ge0rg/MemorizingTrustManager
# submódulo:
git submodule add https://github.com/ge0rg/MemorizingTrustManager
Después añade una dependencia de proyecto de biblioteca a default.properties:
android.library.reference.1=MemorizingTrustManager
Edita tu AndroidManifest.xml y añade el elemento de actividad de MTM justo antes del
final de tu etiqueta de cierre </application>.
...
<activity android:name="de.duenndns.ssl.MemorizingActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
/>
</application>
</manifest>
Conectando MemorizingTrustManager en conexiones HTTPS:
// registra MemorizingTrustManager para 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()));
Para SSLSocket deberías hacer lo siguiente:
// registra MemorizingTrustManager para todos los 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);
// conecta un socket
SSLSocket s = ...;
s.startHandshake();
if (!hv.verify(your_domain_name, sslSocket.getSession())) {
throw new CertificateException("Server failed to authenticate as " + your_domain_name);
}
O, para Smack puedes usar 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()));
Por defecto, MTM recurre al TrustManager del sistema antes de preguntar al usuario.
Si no confías en el establecimiento, puedes forzar un diálogo en cada nueva
conexión proporcionando un parámetro defaultTrustManager = null al
constructor:
MemorizingTrustManager mtm = new MemorizingTrustManager(this, null);
Si quieres usar un TrustManager subyacente diferente, como
AndroidPinning, simplemente pásalo al
constructor de MTM:
X509TrustManager pinning = new PinningTrustManager(SystemKeyStore.getInstance(),
new String[] {"f30012bbc18c231ac1a44b788e410ce754182513"}, 0);
MemorizingTrustManager mtm = new MemorizingTrustManager(this, pinning);
MTM usa java.util.logging (JUL) para propósitos de registro. Si no has configurado un Handler para JUL, entonces Android registrará por defecto todos los mensajes de nivel INFO o superior. Para obtener también los mensajes de registro de depuración (aquellos con nivel FINE o inferior) necesitas configurar un Handler en consecuencia. El proyecto de ejemplo de MTM contiene de.duenndns.mtmexample.JULHandler, que permite habilitar y deshabilitar el registro de depuración en tiempo de ejecución.
MemorizingTrustManager no es el único que existe.
NetCipher es una biblioteca de Android creada por el Guardian Project para mejorar la seguridad de red de las aplicaciones móviles. Viene con un StrongTrustManager para realizar comprobaciones de certificados más exhaustivas, un almacén de CA raíz independiente y código para enrutar fácilmente tu tráfico a través de la red Tor usando Orbot.
AndroidPinning es otra biblioteca de Android, escrita por Moxie Marlinspike para permitir la fijación de certificados de servidor, mejorando la seguridad contra ataques MitM a escala gubernamental. ¡Usa esto si tu aplicación está hecha para comunicarse con un servidor específico!
Por favor, ayuda a traducir MTM a más idiomas!