Заказ сертификатов в CertPath - PullRequest
0 голосов
/ 06 июня 2019

У меня есть 3 сертификата - Корневой CA [A], Промежуточный CA [B] и некоторые сертификаты, подписанные B [C]. Я хотел бы проверить C в Java. У меня CRL и OCSP отключены в тот момент. Java использует реализацию PKIXCertPathValidator для проверки под капотом.

Я попробовал два подхода:

  1. Передайте B и C в CertPath и A в качестве доверенного якоря.
  2. Передайте C в CertPath, A в качестве доверенного якоря и B в качестве CertStore.

Ни один из подходов не работает. Проблема заключается в том, что валидатор получает элемент с индексом 0 из формы CertPath и затем ищет для него доверенную привязку. C подписан B, который не является доверенным якорем, поэтому он терпит неудачу.

Я бы хотел, чтобы это работало так:

  1. Укажите сертификат, который вы хотите проверить.
  2. Укажите доверенную привязку.
  3. Предоставить набор сертификатов, которые МОГУТ быть Промежуточным CA.
  4. Подтвердить сертификат.

1 Ответ

0 голосов
/ 06 июня 2019

Полагаю, вам нужен что-то вроде этого метода:

public static boolean verify(X509Certificate certificateToValidate, List<X509Certificate> potentialCAs, X509Certificate root) {
    for(X509Certificate potentialCa : potentialCAs) {
        try {
            certificateToValidate.verify(potentialCa.getPublicKey());
            potentialCa.verify(root.getPublicKey());
            return true; // there was CA that signed you cert and this ca is signed by root
        } catch (Exception e) {
            //not valid
        }
    }

    return false; // validation failed
}

Вы просто просматриваете свои потенциальные CA и проверяете, подписывает ли этот CA ваш сертификат, если да, вы проверяете, подписал ли root этот CA.

...