我在代码中实现了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);
答案 0 :(得分:2)
实现自己的TrustManager通常是一个坏主意。更好的方法是将证书添加到密钥库,并将其添加为信任库。有关如何操作的示例,请参阅this。
您可能需要将默认信任库添加到验证器。此外,Android默认不进行吊销(CRL)检查,因此如果启用它,则需要手动获取相关的CRL。发布你的代码。