2013-03-01 13 views
6

Sto lavorando a un progetto che recupera le immagini da diversi server (http e https).Connessione Https, differenze tra Android 2.3 e 4

ho trovato this usefull Q/A per evitare il problema di No peer certificate error in Android 2.3, ma non riesco a capire il motivo per cui in Android 4 (> 3) il problema ("No peer certificate error") non stava presentando.

Prego, correggetemi se sbaglio:

  • In Android 2.3 una connessione HTTPS esegue le intere Controlli certificati (e strette di mano);
  • In Android> 3 la connessione HTTPS viene stabilita anche se l'handshake ha esito negativo (ad esempio: la mia app, come peer, non ha il certificato).

Quali sono le differenze tra queste versioni di Android? Perché ho bisogno di Affidare tutto a in Android 2.3 e non in Android 4?

Perché in Android 2.3 ricevo la seguente eccezione: "javax.net.ssl.SSLPeerUnverifiedException: No peer certificate error" mentre in Android 4 tutto funziona correttamente e la connessione è stabilita?

Tutto ciò che riguarda SNI Server Name Indication, introdotto in Android Honeycomb?

+0

Vuoi soluzione o differenza? –

+0

Differenza tra versione Android. SO è pieno di soluzioni. – StarsSky

+0

Il tuo codice funziona su 2.3? –

risposta

2

L'autorità di certificazione probabilmente non è elencata nella versione 2.3.3 di Android, ma è nella versione 4.x. Per scoprire di sicuro controlla il keystore su entrambi i dispositivi.

Utilizzando ADB dalla riga di comando è possibile scaricare il keystore di Android in un file e verificare se tale emittente è disponibile nel proprio keystore (potrebbe essere necessario essere root). /system/etc/security/cacerts.bks adb pull cacerts.bks

Scaricare e installare Portecle (da: http://portecle.sourceforge.net/) Select File/Apri archivio chiavi ... e scegliere il file cacerts.bks. Selezionare Strumenti/Report keystore e copiare tali informazioni in un editor di testo per cercare il CN specificato nel certificato trovato dal browser web. Nel mio caso non sono riuscito a trovarne uno da "Cybertrust Public SureServer SV CA".

Individuare il sito Web di interesse per l'uso di https://example.website.com/ sul browser Web del computer e scoprire chi è il CN. Confrontalo con il keystore come mostrato sopra. Se non è nel keystore, dovrai aggiungerlo.

NOTA: i telefoni Android 4.0 dispongono di un metodo diverso per l'archiviazione dei certificati e non utilizzano il file cacerts.bks indicato di seguito. Per loro dovresti essere in grado di aprire il sito https desiderato nel browser web e aggiungere i certificati desiderati in questo modo.

Ho avuto problemi di connessione a Facebook e redbox. Per risolvere il mio problema e aggiornare i miei certificati Android 2.3.3 ho copiato quello dell'emulatore Android 3.2 e lo ho messo sul mio telefono:

  1. Creare e avviare un dispositivo virtuale Android 3.2.
  2. Copia il file cacerts.bks dall'emulatore (assicurati che l'altro dispositivo non sia connesso). adb pull /system/etc/security/cacerts.bks cacerts.bks
  3. Disconnettere l'emulatore.
  4. Collegare il dispositivo per essere aggiornato (deve essere root). Potrebbe essere necessario rimontare la cartella/system come rw per le capacità di lettura/scrittura. Per i problemi di montaggio, vedi: this link
  5. Salva una copia del vecchio file cert dal dispositivo: /system/etc/security/cacerts.bks adb pull cacerts.bks.old
  6. Inserire il file cert aggiornato sul tuo dispositivo ADB cacerts.bks spinta/system/etc/security/
  7. Riavviare il dispositivo
  8. Ricollegare e verificare il nuovo file CAcert è stato caricato.
+0

Il certificato è presente: CN = VeriSign Classe 3 Autorità di certificazione primaria pubblica - G5, OU = "(c) 2006 VeriSign, Inc. - Solo per uso autorizzato", OU = VeriSign Trust Network, O = "VeriSign, Inc. ", C = US StarsSky

+0

@StarsSky Puoi fornire l'indirizzo del sito con cui stai lavorando? – RightHandedMonkey

+0

Sembra che nel mio kwystore manchi il cert intermedio: VeriSign Class 3 International Server CA - G3. Potrebbe essere la ragione? – StarsSky