2015-06-23 15 views
10

Sto lavorando a un'app Android che richiede l'autenticazione del certificato client (con i file PKCS 12). A seguito della deprecazione di tutto ciò che è apache.http.*, abbiamo iniziato un grosso lavoro di refactoring sul nostro livello di rete, e abbiamo deciso di andare con OkHttp in sostituzione, e finora mi piace molto.Ora che SSLSocketFactory è deprecato su Android, quale sarebbe il modo migliore per gestire l'autenticazione del certificato client?

Tuttavia, non ho trovato nessun altro modo per gestire l'autenticazione del certificato client senza utilizzare SSLSocketFactory, con OkHttp o qualsiasi altra cosa. Quindi quale sarebbe la migliore linea d'azione in questo caso particolare? C'è un altro modo con OkHttp per gestire questo tipo di autenticazione?

+3

'SSLSocketFactory' non è deprecato, sia nelle versioni [di spedizione correnti di Android] (http://developer.android.com/reference/javax/net/ssl/SSLSocketFactory.html) o nel M Anteprima dello sviluppatore. – CommonsWare

+1

Oh mio Dio hai perfettamente ragione, non ho mai realizzato che esistevano 2 classi SSLSocketFactory! org.apache.http.conn.ssl.SSLSocketFactory è deprecato ma javax.net.ssl.SSLSocketFactory non lo è! Grazie mille per questa illuminazione. – TheYann

+1

Al contrario, non mi ero reso conto che HttpClient avesse la propria classe 'SSLSocketFactory'. :-) – CommonsWare

risposta

21

se si utilizza https, è necessario utilizzare un certificato valido. In fase di sviluppo devi fidarti del certificato, come? sslSocketFactory(SSLSocketFactory sslSocketFactory) è obsoleto ed è stato sostituito da sslSocketFactory(SSLSocketFactory sslSocketFactory, X509TrustManager trustManager), è necessario aggiornare il file gradle nella seguente parte di codice per ottenere un OkHttpClient attendibile che si fidi di qualsiasi certificato 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

Grazie, l'avviso deprecato viene rimosso semplicemente aggiungendo il gestore di fiducia. – tryp