2011-11-29 10 views
5

Zaimplementowałem kod javax.net.ssl.X509TrustManager, aby zweryfikować certyfikat z podpisem własnym, do którego uzyskuje dostęp moje oprogramowanie. Jednak nadal muszę zweryfikować niektóre inne "standardowe" certyfikaty SSL witryny. Używam do tego celu CertPathValidator.validate(), ale właśnie zdałem sobie sprawę, że jeden łańcuch certyfikatów, który jestem przekazywany (dla maps.googleapis.com) w rzeczywistości nie zawiera kompletnego łańcucha - zawiera cały łańcuch, ale główny ośrodek certyfikacji (Equifax), który istnieje w telefonie, ale validate() nadal nie działa, ponieważ (widocznie) nie jest jawnie w łańcuchu. Czego mi tu brakuje, aby walidacja się udała? Dzięki za wszelkie dane wejściowe.Ręczne sprawdzenie łańcucha certyfikatów X509

Edit - odpowiedni kod (z wyjątkiem sprawdzania usunięte):

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

Jeszcze więcej szczegółów: Otrzymałem 'CertPathValidatorException' z połączenia z' validate() 'z błędem, ** org.bouncycastle.jce.exception.ExtCertPathValidatorException: Nie znaleziono CRL dla wystawcy" OU = Equifax Secure Certificate Authority , O = Equifax, C = US "** – Conrad

Odpowiedz

2

Implementacja własnego TrustManager jest ogólnie zły pomysł. Lepszym sposobem jest dodanie certyfikatów do magazynu kluczy i dodanie go jako magazynu zaufanych certyfikatów. Zobacz this, aby dowiedzieć się, jak to zrobić.

Prawdopodobnie musisz dodać domyślny magazyn zaufanych certyfikatów do walidatora. Ponadto Android nie sprawdza domyślnie sprawdzania odwołań (CRL), więc jeśli go włączysz, musisz ręcznie uzyskać powiązane listy CRL. Opublikuj swój kod.

+0

Dzięki za link - sprawdzę to. – Conrad

+0

To wygląda na poprawną odpowiedź, ale używam bibliotek firm trzecich, które nazywają "DefaultHttpClient" i nie chcę ich rekompilować, więc po prostu pozwolę, aby moje połączenia z maps.googleapis.com były niezabezpieczone ten punkt. Dzięki za wskaźnik. – Conrad

+0

@Nikolay, "Wdrożenie własnego TrustManager jest generalnie złym pomysłem." Zgadzam się. Ale potrzebujemy zweryfikować certyfikat za pomocą listy CRL. Android nie jest. Jak możemy to rozwiązać? –

Powiązane problemy