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);
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