2010-10-31 15 views
15

Czy jest coś podobnego do ustawienia -D javax.net.debug=ssl w linii poleceń dla aplikacji Java na komputer, ale dla Androida? Próbowałem ustawić go w kodzie za pomocą System.setProperty("javax.net.debug", "ssl");, ale to nie zadziałało.Jak włączyć debugowanie SSL na platformie Android?

Jeśli nie ma sposobu na włączenie tej właściwości, czy istnieje co najmniej inny sposób debugowania po stronie klienta połączenia SSL?

EDIT: Właśnie w celu wyjaśnienia, to odnosi się do gniazd surowych SSL (SSLSocket i SSLSocketFactory), a nie biblioteki Apache lub jakiekolwiek inne biblioteki sieciowej.

+0

Chciałbym też to wiedzieć, ale nie mogłem znaleźć żadnej wskazówki na ten temat. : S – gnclmorais

Odpowiedz

1

W tym momencie, nie tylko nie wydaje się być sposób to zrobić. Ale w każdym razie wkrótce przejdziemy do biblioteki Netty, która ma wbudowane bardziej szczegółowe funkcje rejestrowania.

Zatem (nie świetne) rozwiązaniem tego problemu jest po prostu nie używanie SSLSocket, ale korzystanie z lepszej sieci biblioteka zamiast.

+1

Jeśli pojawi się ktoś, kto rzeczywiście znalazł sposób na włączenie debugowania uzgadniania dla SSLSocket, dodaj swoją odpowiedź, a ja zaakceptuję twój. –

0

Jeśli używasz Apache HttpClient (importując plik jar), możesz włączyć rejestrowanie, ustawiając zmienne środowiskowe w Eclipse. Jeśli korzystasz z funkcji Rejestrowanie w Commons, dzienniki są drukowane na konsoli. Działa to jednak tylko wtedy, gdy używasz aplikacji w emulatorze, a nie na urządzeniu. Nie jestem pewien, co to pomaga.

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

+0

Przepraszam, powinienem być bardziej przejrzysty, nie używam biblioteki Apache, to jest z surowymi gniazdami SSL. Na komputerowej Javie bardzo łatwo jest przeprowadzić debugowanie przy uzgadnianiu SSL, ale na Androidzie wydaje się to niemożliwe. –

1

można napisać klasę TrustManager do obsługi. przykład:

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 można wydrukować łańcuch tak:

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

Znalazłem użyteczną pomoc debugowania jest napisać otoki wokół X509KeyManager i X509TrustManager że delegaci wzywa do oryginalna implementacja podczas rejestrowania wyników, np .:

 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()); 

Implementacja WrapTrustManager i WrapKeyManager to pret są proste, ale ostrzegamy, że używają wyjątków do sygnalizowania porażki, dlatego ważne jest, aby nie przełykać wyjątków podczas rejestrowania wyniku.

Należy pamiętać, że interfejs używa pustych interfejsów KeyManager i TrustManager i trzeba je dynamicznie uaktualnić do X509KeyManager i X509TrustManager.

Powiązane problemy