Android手册X509证书链验证

Con*_*rad 5 validation ssl android 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);
Run Code Online (Sandbox Code Playgroud)

Nik*_*kov 2

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

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