2011-11-29 5 views
5

Ho implementato nel mio codice in modo da poter convalidare il mio certificato autofirmato, a cui accede il mio software. Tuttavia, ho ancora bisogno di convalidare alcuni altri certificati SSL "standard" del sito web. Sto usando CertPathValidator.validate() per farlo, ma ho appena realizzato che una catena di certificati che sto passando (per maps.googleapis.com) in realtà non contiene la catena completa - contiene l'intera catena ma la CA radice (Equifax), che esiste sul telefono, ma validate() non riesce ancora perché (apparentemente) non è esplicitamente nella catena. Cosa mi manca qui, in modo che la convalida abbia successo? Grazie per qualsiasi input.manuale Android convalida catena certificato X509

Modifica - relativo codice (con l'eccezione checking rimosso):

CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
// chain is of type X509Certificate[] 
CertPath cp = cf.generateCertPath(Arrays.asList(chain)); 

CertPathValidator cpv = CertPathValidator.getInstance(CertPathValidator.getDefaultType()); 
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 

FileInputStream is = new FileInputStream("/system/etc/security/cacerts.bks"); 
ks.load(is, null); 

PKIXParameters params = new PKIXParameters(ks); 
CertPathValidatorResult cpvr = cpv.validate(cp, params); 
+0

Altri dettagli: Ricevo un 'CertPathValidatorException' dalla chiamata a' validate() 'con l'errore, ** org.bouncycastle.jce.exception.ExtCertPathValidatorException: Nessun CRL trovato per l'emittente" OU = Equifax Secure Certificate Authority , O = Equifax, C = US "** – Conrad

risposta

2

Implementare il proprio TrustManager è generalmente una cattiva idea. Il modo migliore è aggiungere i certificati a un keystore e aggiungerlo come archivio fidato. Vedere this per un esempio su come farlo.

Probabilmente è necessario aggiungere il trust store predefinito al proprio validatore. Inoltre, Android non esegue il controllo di revoca (CRL) per impostazione predefinita, quindi se lo hai abilitato, devi ottenere manualmente i relativi CRL. Pubblica il tuo codice.

+0

Grazie per il link - lo controllerò. – Conrad

+0

Questa sembra essere la risposta corretta, ma sto usando librerie di terze parti che chiamano "DefaultHttpClient" e non voglio entrare nella loro ricompilazione, quindi lascerò le mie chiamate su maps.googleapis.com insicure a questo punto. Grazie per il puntatore. – Conrad

+0

@Nikolay, "L'implementazione del proprio TrustManager è generalmente una cattiva idea." Sono d'accordo. Ma, abbiamo bisogno di verificare il certificato con CRL. Android non lo è. Come possiamo risolvere? –