С точки зрения программиста, вам нужно несколько вещей для проверки сертификата X.509.
- Набор «якорей доверия» - корневых сертификатов CA, на которые вы полагаетесь. Они должны быть защищены от взлома, чтобы злоумышленник не заменил сертификат CA своей собственной фальшивкой. Открытые ключи в этих сертификатах используются для проверки цифровых подписей на других сертификатах.
- Коллекция промежуточных сертификатов. Приложение может хранить их набор, но большинство протоколов, таких как SSL и S / MIME, которые используют сертификаты, имеют стандартный способ предоставления дополнительных сертификатов. Хранение их не требует особого ухода; их целостность защищена подписью корневого ЦС.
- Информация об отзыве. Даже если сертификат был выдан ЦС, он мог быть аннулирован преждевременно, потому что был раскрыт закрытый ключ, или конечный объект изменил свою личность. (Например, человек меняет работу и отзывает сертификат с именем своей старой компании.) CRL или веб-сервис, такой как OCSP, можно использовать для получения обновления о статусе сертификата.
Имея эти входные данные, вы можете использовать встроенную поддержку PKIX * 1011 * для создания и проверки пути сертификата.
/* Givens. */
InputStream trustStoreInput = ...
char[] password = ...
List<X509Certificate> chain = ...
Collection<X509CRL> crls = ...
/* Construct a valid path. */
KeyStore anchors = KeyStore.getInstance(KeyStore.getDefaultType());
anchors.load(trustStoreInput, password);
X509CertSelector target = new X509CertSelector();
target.setCertificate(chain.get(0));
PKIXBuilderParameters params = new PKIXBuilderParameters(anchors, target);
CertStoreParameters intermediates = new CollectionCertStoreParameters(chain)
params.addCertStore(CertStore.getInstance("Collection", intermediates));
CertStoreParameters revoked = new CollectionCertStoreParameters(crls);
params.addCertStore(CertStore.getInstance("Collection", revoked));
CertPathBuilder builder = CertPathBuilder.getInstance("PKIX");
/*
* If build() returns successfully, the certificate is valid. More details
* about the valid path can be obtained through the PKIXBuilderResult.
* If no valid path can be found, a CertPathBuilderException is thrown.
*/
PKIXBuilderResult r = (PKIXBuilderResult) builder.build(params);
Важно отметить, что если путь не может быть найден, вы не получите много информации о причине. Это может быть неприятно, но это так по замыслу. В общем, есть много потенциальных путей. Если все они потерпят неудачу по разным причинам, как построитель пути решит, что сообщить в качестве причины?