2010-10-31 17 views
15

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

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

EDIT: Для уточнения это относится к необработанным SSL-сокетам (SSLSocket и SSLSocketFactory), а не к библиотеке Apache или к любой другой сетевой библиотеке.

+0

Я также хотел бы знать это, но я не мог найти ни малейшего понятия об этом. : S – gnclmorais

ответ

1

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

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

+1

Если кто-нибудь приходит, что на самом деле нашел способ включить отладку рукопожатия для SSLSocket, добавьте свой ответ, и я соглашусь вместо вас. –

0

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

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

+0

Извините, я должен был быть более ясным, я не использую библиотеку Apache, это с сырыми SSL-сокетами. На настольной Java очень просто сделать отладку по SSL-квитированию, но на Android это кажется невозможным. –

1

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

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

Смежные вопросы