【发布时间】:2011-11-29 20:23:55
【问题描述】:
我已经在我的代码中实现了javax.net.ssl.X509TrustManager,因此我可以验证我的软件可以访问的自签名证书。但是,我仍然需要验证一些其他“标准”网站 SSL 证书。我正在使用CertPathValidator.validate() 来执行此操作,但我刚刚意识到我正在通过的一个证书链(对于 maps.googleapis.com)实际上并不包含完整的链 - 它包含整个链,但包含根 CA(Equifax ),它确实存在于手机上,但validate() 仍然失败,因为(显然)它没有明确地在链中。我在这里缺少什么,以便验证成功?感谢您的任何意见。
编辑 - 相关代码(删除异常检查):
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);
【问题讨论】:
-
更多细节:我从对
validate()的调用中得到一个CertPathValidatorException错误,org.bouncycastle.jce.exception.ExtCertPathValidatorException: No CRLs found for issuer "OU= Equifax 安全证书颁发机构,O=Equifax,C=US"
标签: android validation ssl ssl-certificate x509certificate