2015-06-23 32 views
10

Pracuję nad aplikacją dla systemu Android, która wymaga uwierzytelniania certyfikatów klienta (z plikami PKCS 12). Po wycofaniu wszystkiego, co jest apache.http.*, rozpoczęliśmy całkiem sporą pracę związaną z refaktoryzacją na naszej warstwie sieciowej i zdecydowaliśmy się na zastąpienie OkHttp i jak dotąd bardzo to lubię.Teraz, gdy protokół SSLSocketFactory jest przestarzały w systemie Android, jaki byłby najlepszy sposób obsługi uwierzytelniania certyfikatów klienta?

Jednak nie znalazłem żadnego innego sposobu na obsłużenie autoryzacji certyfikatu klienta bez użycia SSLSocketFactory, z OkHttp lub cokolwiek innego w tym zakresie. Jaki byłby najlepszy sposób postępowania w tym konkretnym przypadku? Czy jest inny sposób, aby OkHttp obsługiwał tego rodzaju uwierzytelnianie?

+3

'SSLSocketFactory' nie jest nieaktualny, albo w [bieżących wersjach żeglugi Androida] (http://developer.android.com/reference/javax/net/ssl/SSLSocketFactory.html) lub M Podgląd deweloperski. – CommonsWare

+1

O mój Boże, masz absolutną rację, nigdy nie zdawałem sobie sprawy, że są 2 klasy SSLSocketFactory! org.apache.http.conn.ssl.SSLSocketFactory jest przestarzałe, ale javax.net.ssl.SSLSocketFactory nie jest! Wielkie dzięki za to oświecenie. – TheYann

+1

Odwrotnie, nie zdawałem sobie sprawy, że HttpClient ma własną klasę 'SSLSocketFactory'. :-) – CommonsWare

Odpowiedz

21

jeśli używasz protokołu HTTPS, musisz użyć ważnego certyfikatu. Podczas etapu deweloperskiego musisz zaufać certyfikatowi, w jaki sposób? sslSocketFactory(SSLSocketFactory sslSocketFactory) jest przestarzałe i zostało zastąpione przez sslSocketFactory(SSLSocketFactory sslSocketFactory, X509TrustManager trustManager), musisz zaktualizować swój plik gradle poniższy fragment kodu pomoże ci uzyskać zaufanego OkHttpClient, który ufa jakimkolwiek certyfikatom ssl.

TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
trustManagerFactory.init((KeyStore) null); 
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); 
if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) { 
    throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers)); 
} 
X509TrustManager trustManager = (X509TrustManager) trustManagers[0]; 
SSLContext sslContext = SSLContext.getInstance("SSL"); 
sslContext.init(null, new TrustManager[] { trustManager }, null); 
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); 
OkHttpClient client = new OkHttpClient.Builder().sslSocketFactory(sslSocketFactory, trustManager); 
+2

Dzięki, przestarzałe ostrzeżenie zostanie usunięte po prostu przez dodanie menedżera zaufania. – tryp