Самоподписанное принятие SSL на Android

Используя Xdebug в сочетании с PHPUnit может дать Вам анализ покрытия кода.

52
задан Peter Mortensen 11 June 2016 в 01:23
поделиться

2 ответа

У меня есть эта функция взамен ExchangeIt, которая подключается к Microsoft Exchange через WebDav. Вот код для создания HttpClient, который будет подключаться к самоподписанным сертификатам через SSL:

SchemeRegistry schemeRegistry = new SchemeRegistry();
// http scheme
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
// https scheme
schemeRegistry.register(new Scheme("https", new EasySSLSocketFactory(), 443));

HttpParams params = new BasicHttpParams();
params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 30);
params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(30));
params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false);
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);

ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);

EasySSLSocketFactory - здесь , а EasyX509TrustManager - здесь .

Код для exchangeIt является открытым исходным кодом и размещен на googlecode здесь , если у вас есть какие-либо проблемы. Я больше не работаю над этим активно, но код должен работать.

Обратите внимание, что начиная с Android 2.2 процесс немного изменился, поэтому проверьте this , чтобы приведенный выше код работал.

37
ответ дан 7 November 2019 в 09:10
поделиться

Как правильно прокомментировал EJP, «Читатели должны отметить, что этот метод в корне небезопасен. SSL не является безопасным, если хотя бы один партнер не аутентифицирован. См. RFC 2246».

Наличие сказал, что вот другой способ, без дополнительных классов:

import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.X509TrustManager;

private void trustEveryone() {
    try {
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier(){
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }});
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, new X509TrustManager[]{new X509TrustManager(){
            public void checkClientTrusted(X509Certificate[] chain,
                    String authType) throws CertificateException {}
            public void checkServerTrusted(X509Certificate[] chain,
                    String authType) throws CertificateException {}
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }}}, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(
                context.getSocketFactory());
    } catch (Exception e) { // should never happen
        e.printStackTrace();
    }
}
37
ответ дан 7 November 2019 в 09:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: