
Um "plugin" para Android Java para permitir perguntar ao utilizador sobre certificados SSL
O MemorizingTrustManager (MTM) é um projeto para permitir um uso mais inteligente e seguro de SSL no Android. Se ele encontrar um certificado SSL desconhecido, perguntará ao usuário se deseja aceitar o certificado uma vez, permanentemente ou abortar a conexão. Este é um passo para prevenir ataques man-in-the-middle ao aceitar cegamente certificados inválidos, autoassinados e/ou expirados.
O MTM tem como objetivo fornecer integração perfeita ao seu aplicativo Android, e o código-fonte está disponível sob a licença MIT.

O MemorizingTrustManager está em uso em produção no cliente XMPP yaxim. Ele é utilizável e fácil de integrar, embora ainda não suporte validação de hostname (a API Java torna difícil a integração).
O MTM é fácil de integrar ao seu próprio aplicativo. Siga estes passos ou dê uma
olhada no aplicativo de demonstração no diretório example.
Baixe o código-fonte do MTM do GitHub ou adicione-o como um submódulo git:
# download simples:
git clone https://github.com/ge0rg/MemorizingTrustManager
# submódulo:
git submodule add https://github.com/ge0rg/MemorizingTrustManager
Em seguida, adicione uma dependência de projeto de biblioteca ao default.properties:
android.library.reference.1=MemorizingTrustManager
Edite seu AndroidManifest.xml e adicione o elemento da activity do MTM logo antes
do final da sua tag de fechamento </application>.
...
<activity android:name="de.duenndns.ssl.MemorizingActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
/>
</application>
</manifest>
Integrando o MemorizingTrustManager em conexões HTTPS:
// registra o 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, você deve fazer o seguinte:
// registra o MemorizingTrustManager para todos os 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 um 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, para Smack, você pode 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 padrão, o MTM usa o TrustManager do sistema antes de perguntar ao usuário.
Se você não confiar na configuração, pode forçar um diálogo em toda nova conexão
fornecendo um parâmetro defaultTrustManager = null ao construtor:
MemorizingTrustManager mtm = new MemorizingTrustManager(this, null);
Se você quiser usar um TrustManager subjacente diferente, como
AndroidPinning, basta fornecê-lo ao
construtor do MTM:
X509TrustManager pinning = new PinningTrustManager(SystemKeyStore.getInstance(),
new String[] {"f30012bbc18c231ac1a44b788e410ce754182513"}, 0);
MemorizingTrustManager mtm = new MemorizingTrustManager(this, pinning);
O MTM usa java.util.logging (JUL) para fins de registro. Se você não configurou um Handler para JUL, o Android registrará por padrão todas as mensagens de nível Level.INFO ou superior. Para obter também as mensagens de log de depuração (aquelas com Level.FINE ou inferior), você precisa configurar um Handler de acordo. O projeto de exemplo do MTM contém de.duenndns.mtmexample.JULHandler, que permite ativar e desativar o registro de depuração em tempo de execução.
O MemorizingTrustManager não é o único por aí.
O NetCipher é uma biblioteca Android criada pelo Guardian Project para melhorar a segurança de rede em aplicativos móveis. Ela vem com um StrongTrustManager para fazer verificações de certificado mais completas, um armazenamento de CAs raiz independente e código para rotear facilmente seu tráfego através da rede Tor usando o Orbot.
O AndroidPinning é outra biblioteca Android, escrita por Moxie Marlinspike para permitir a fixação (pinning) de certificados de servidor, melhorando a segurança contra ataques MitM em escala governamental. Use esta biblioteca se o seu aplicativo for feito para se comunicar com um servidor específico!
Ajude a traduzir o MTM para mais idiomas!