Как включить отладку SSL на платформе Android? - программирование
Подтвердить что ты не робот

Как включить отладку SSL на платформе Android?

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

вы можете написать класс 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);
  }
}

Ответ 3

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

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

Ответ 4

Я нашел полезную помощь для отладки, чтобы написать обертку вокруг 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.