Как включить отладку SSL на платформе Android? - PullRequest
17 голосов
/ 01 ноября 2010

Есть ли что-то похожее на установку -D javax.net.debug=ssl в командной строке для настольных приложений Java, но для Android? Я попытался установить его в коде через System.setProperty("javax.net.debug", "ssl");, но это не сработало.

Если нет способа включить это свойство, есть ли хотя бы другой способ отладки клиентской части SSL-соединения?

РЕДАКТИРОВАТЬ: Просто чтобы уточнить, это относится к необработанным сокетам SSL (SSLSocket и SSLSocketFactory), а не к библиотеке Apache или любой другой сетевой библиотеке.

Ответы [ 4 ]

2 голосов
/ 13 января 2012

На данный момент просто не существует способа сделать это.Но в любом случае мы скоро перейдем на библиотеку Netty, в которую встроены более подробные возможности ведения журналов.

Так что (не очень) решение этой проблемы просто не в использовании SSLSocket, а в использованииЛучшая сетевая библиотека.

2 голосов
/ 14 июля 2014

вы можете написать класс TrustManager для его обработки.пример:

ClientConnectionManager cm = new BasicClientConnectionManager();
cm.getSchemeRegistry().register(createHttpsScheme());
DefaultHttpClient client = new DefaultHttpClient(cm);
String url = "https://your domain/your url";
HttpGet get = new HttpGet(url);
HttpResponse resp = client.execute(get);

etc..

public static Scheme createHttpsScheme() {
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, new TrustManager[] {
                new TestTrustManager()
        }, new SecureRandom());

        SSLSocketFactory sf = new SSLSocketFactory(context);
        return new Scheme("https", 443, sf);
}

int TestTrustManager.java вы можете напечатать цепочку следующим образом:

public class TestTrustManager implements X509TrustManager {
    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {

       for (int i = 0; i < chain.length; ++i) {
        System.out.println(chain[i]);
       }

       decorated.checkServerTrusted(chain, authType);
  }
}
0 голосов
/ 05 апреля 2016

Я обнаружил, что полезным средством отладки является написание оболочки вокруг X509KeyManager и X509TrustManager, которая делегирует вызовы исходной реализации во время регистрации результатов, например ::

        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(ks);

        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(ks, null);

        TrustManager[] tms = WrapTrustManager.WrapArray(tmf.getTrustManagers());
        KeyManager[] kms = WrapKeyManager.WrapArray(kmf.getKeyManagers());
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(kms, tms, null);

        ....setSocketFactory(context.getSocketFactory());

Реализация WrapTrustManager и WrapKeyManager довольно проста, но предупреждает, что они используют исключения для обозначения сбоя, поэтому важно не глотать исключения во время регистрации результата.

Обратите внимание, что интерфейс использует пустые интерфейсы KeyManager и TrustManager, и вам необходимо динамически преобразовать их в X509KeyManager и X509TrustManager.

0 голосов
/ 17 марта 2011

Если вы используете Apache HttpClient (путем импорта файла JAR), вы можете включить ведение журнала, установив переменные среды в Eclipse. Если вы используете Commons Logging, журналы выводятся на консоль. Однако это работает, только если вы запускаете свое приложение в эмуляторе, а не на устройстве. Не уверен, что это помогает.

См. http://hc.apache.org/httpcomponents-client-ga/logging.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...