Я пытаюсь проверить цепочку сертификатов, которые я сгенерировал самостоятельно, и мне кажется, что я получаю правильные результаты, но я не уверен, что делаю это правильно.
Скажите, что у меня есть цепь Intermediate -> Intermediate -> Leaf
. Меня не волнует root, я хочу проверить до определенного момента в цепочке. Это может быть root или просто фрагмент более длинной цепочки, при условии, что он не поврежден.
Для уточнения; Я хочу проверить эту цепочку независимо от конечного root. Root -> Intermediate 1 -> Intermediate 2 -> Leaf
должен быть действительным, а также только Intermediate 1 -> Intermediate 2 -> Leaf
. Единственное отличие здесь должно быть (?) В том, что считается TrustAnchor.
Чтобы сделать это, я следовал этой Oracle документации .
Вот мой код фрагмент:
public boolean validateChain(final X509Certificate... certificates) {
try {
final CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
final X509Certificate intermediateCertificate = certificates[0];
final X509Certificate leaf = certificates[1];
final List<X509Certificate> path = Collections.singletonList(leaf);
final CertPath certPath = certificateFactory.generateCertPath(path);
Set<TrustAnchor> anchors = new HashSet<>();
anchors.add(new TrustAnchor(intermediateCertificate, null));
final X509Certificate root = this.certificate;
anchors.add(new TrustAnchor(root, null));
PKIXParameters params = new PKIXParameters(anchors);
params.setRevocationEnabled(false);
CertPathValidator validator = CertPathValidator.getInstance("PKIX");
validator.validate(certPath, params);
return true;
} catch (final GeneralSecurityException e) {
LOG.error("Could not validate certificate chain", e);
}
return false;
}
Не обращайте внимания на элементарную обработку массивов, я улучшу это. Эта реализация предполагает, что мой базовый класс был реализован, и это всегда root, по которому проверяются предоставленные сертификаты.
Это правильный способ сделать это? Я не очень понимаю различие между TrustAnchor и сертификатами, помещенными в CertPath.
Если я добавлю сертификат с именем intermediateCertificate
в конструкцию CertPath, выполнение завершится неудачно с:
Причина: java .security.cert.CertPathValidatorException: проверка цепочки имени субъекта / эмитента завершилась неудачно
Скажите, если я хочу проверить цепочку с 10 сертификатами, должен только лист сертификат должен быть помещен в CertPath, а все остальные сертификаты, указанные выше в цепочке, считаются TrustAnchors?
Если кто-то может пролить свет на это различие, я был бы очень признателен.
Дополнительно Редактирование информации:
Я знаю, что моя цепочка действительна, потому что я проверил всю свою цепочку, используя OpenSSL. Это вся моя цепочка, в которой каждый файл содержит только публичную c часть сертификата.
openssl verify -CAfile root.pem -untrusted intermediate1.pem -untrusted intermediate2.pem leaf.pem
Я также проверил частичную цепочку:
openssl verify -no-CApath -partial_chain -trusted intermediate1.pem -trusted intermediate2.pem leaf.pem
Оба эти ответить leaf.pem: OK
.