Android手册X509证书链验证

时间:2011-11-29 20:23:55

标签: android validation ssl ssl-certificate x509certificate

我在代码中实现了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);

1 个答案:

答案 0 :(得分:2)

实现自己的TrustManager通常是一个坏主意。更好的方法是将证书添加到密钥库,并将其添加为信任库。有关如何操作的示例,请参阅this

您可能需要将默认信任库添加到验证器。此外,Android默认不进行吊销(CRL)检查,因此如果启用它,则需要手动获取相关的CRL。发布你的代码。