【问题标题】:Android manual X509 certificate chain validationAndroid手册X509证书链验证
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 感谢您的链接 - 我会检查一下。
  • 这看起来是正确的答案,但我正在使用调用 DefaultHttpClient 的第 3 方库,我不想重新编译它们,所以我只会让我调用地图.googleapis.com 在这一点上是不安全的。谢谢指点。
  • @Nikolay,“实施您自己的 TrustManager 通常是个坏主意。”我同意。但是,我们需要使用 CRL 验证证书。安卓没有。我们该如何解决?
猜你喜欢
  • 2013-01-28
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 2011-11-11
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
相关资源
最近更新 更多