Как включить отладку SSL на платформе Android?
Есть ли что-то похожее на установку -D javax.net.debug=ssl
в командной строке для настольных приложений Java, но для Android? Я попытался установить его в коде через System.setProperty("javax.net.debug", "ssl");
, но это не сработало.
Если нет возможности включить это свойство, существует ли хотя бы один способ отладки клиентской стороны SSL-соединения?
РЕДАКТИРОВАТЬ: Просто пояснить, это относится к необработанным сокетам SSL (SSLSocket и SSLSocketFactory), а не к библиотеке Apache или к любой другой сетевой библиотеке.
Ответы
Ответ 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.