Руководство по проверке цепочки сертификатов X509 для Android - PullRequest
5 голосов
/ 30 ноября 2011

Я реализовал javax.net.ssl.X509TrustManager в своем коде, чтобы я мог проверить свой самоподписанный сертификат, к которому обращается мое программное обеспечение.Однако мне все еще нужно проверить некоторые другие «стандартные» сертификаты SSL на веб-сайте.Я использую CertPathValidator.validate() для этого, но я только что понял, что одна цепочка сертификатов, которую я передаю (для maps.googleapis.com), на самом деле не содержит полную цепочку - она ​​содержит всю цепочку, но Root 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 Ответ

2 голосов
/ 30 ноября 2011

Реализация собственного TrustManager, как правило, плохая идея.Лучший способ - добавить сертификаты в хранилище ключей и добавить его в хранилище доверенных сертификатов.См. this для примера того, как это сделать.

Возможно, вам нужно добавить хранилище доверия по умолчанию в ваш валидатор.Кроме того, Android не выполняет проверку отзыва (CRL) по умолчанию, поэтому, если вы включили его, вам необходимо получить соответствующие списки отзыва сертификатов вручную.Разместите свой код.

...