我在我的代碼中實施了javax.net.ssl.X509TrustManager
,這樣我就可以驗證我的軟件所訪問的自簽名證書。但是,我仍然需要驗證其他一些「標準」網站SSL證書。我正在使用CertPathValidator.validate()
來做到這一點,但我只是意識到我正在通過的一個證書鏈(對於maps.googleapis.com)實際上並不包含完整的鏈 - 它包含整個鏈,但包含根CA(Equifax),這在手機上確實存在,但validate()
仍然失敗,因爲(顯然)它沒有明確地在鏈中。我在這裏錯過了什麼,以便驗證成功?感謝您的任何意見。Android手冊X509證書鏈驗證
編輯 - 相關代碼(有異常檢查刪除):
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);
一些更多的細節:我得到一個'CertPathValidatorException'從調用到'validate()'的錯誤,** org.bouncycastle.jce.exception.ExtCertPathValidatorException:找不到發行者的CRL「OU = Equifax安全認證中心,O = Equifax,C = US「** – Conrad