Причина сравнения interim_reasons_mask и Reason_mask в обработке CRL

В RFC5280 в 6.3.3. В разделе CRL Processing есть шаг:

Verify that interim_reasons_mask includes one or more reasons that are not included in the reasons_mask.

Может кто-нибудь объяснить, в чем смысл этой проверки. Когда я пытаюсь проверить сертификат с точкой распространения, указывающей на некоторый URL-адрес, происходит сбой в DistributionPointFetcher:591. ReasonMasks имеет значение 9 true, поэтому я не понимаю, как можно пройти эту проверку, потому что, поскольку она была инициализирована, она никогда не менялась.

Обновлять

Код, в котором инициализируется маска причин: Связь

Код, в котором маска причин передается для обработки в DistributionPointFetcher: Связь

Пожалуйста, покажите соответствующий код и точно укажите проблему или ошибку. Одного описания недостаточно. Также см. Как создать минимальный, полный и проверяемый пример.

jww 06.10.2019 06:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

reasons_mask: This variable contains the set of revocation reasons supported by the CRLs and delta CRLs processed so far.

interim_reasons_mask: This contains the set of revocation reasons supported by the CRL or delta CRL currently being processed.

Цель этой обработки, насколько я могу судить, состоит в том, чтобы собрать CRL для поддержки как можно большего количества причин отзыва. Таким образом, добавление текущего CRL в список нужно только в том случае, если он поддерживает какие-либо причины отзыва, которые не поддерживались ни одним из предыдущих CRL.

Если ваш reasons_mask содержит все true, то предыдущие CRL охватывают все причины аннулирования, или в одном из них не указаны конкретные причины аннулирования, которые он поддерживает, что приводит к установке специального значения all-reasons (все флаги истинны), а это означает, что никаких дополнительных причин аннулирования не требуется. быть покрыты, таким образом, он не удосуживается проверить дальше.


sun.security.provider.certpath.DistributionPointFetcher.java

...
// compute interim reasons mask
boolean[] interimReasonsMask = new boolean[9];
ReasonFlags reasons = null;
if (idpExt != null) {
    reasons = (ReasonFlags) idpExt.get(IssuingDistributionPointExtension.REASONS);
}

boolean[] pointReasonFlags = point.getReasonFlags();
if (reasons != null) {
    if (pointReasonFlags != null) {
        // set interim reasons mask to the intersection of
        // reasons in the DP and onlySomeReasons in the IDP
        boolean[] idpReasonFlags = reasons.getFlags();
        for (int i = 0; i < interimReasonsMask.length; i++) {
            interimReasonsMask[i] = (i < idpReasonFlags.length && idpReasonFlags[i])
                    && (i < pointReasonFlags.length && pointReasonFlags[i]);
        }
    } else {
        // set interim reasons mask to the value of
        // onlySomeReasons in the IDP (and clone it since we may
        // modify it)
        interimReasonsMask = reasons.getFlags().clone();
    }
} else if (idpExt == null || reasons == null) {
    if (pointReasonFlags != null) {
        // set interim reasons mask to the value of DP reasons
        interimReasonsMask = pointReasonFlags.clone();
    } else {
        // set interim reasons mask to the special value all-reasons
        Arrays.fill(interimReasonsMask, true);  // ### SEE HERE ###
    }
}

// verify that interim reasons mask includes one or more reasons
// not included in the reasons mask
boolean oneOrMore = false;
for (int i = 0; i < interimReasonsMask.length && !oneOrMore; i++) {
    if (interimReasonsMask[i] && !(i < reasonsMask.length && reasonsMask[i])) {
        oneOrMore = true;
    }
}
if (!oneOrMore) {
    return false;
}
...

Спасибо за уделенное время. Я добавил ссылки на код, в котором создается Reason_mask и передается в DistributionPointFetcher. Первоначально для него задано значение all-reasons, и если утвержденных CRL нет, все причины передаются в DistributionPointFetcher. Когда сборщик извлекает CRL из расширений X509, он не может их проверить, потому что в Reason_mask указаны все причины. Насколько я понимаю код, он просто не может работать, пока не будут доступны одобренные CRL.

Julian Rubin 27.06.2019 23:22

Хорошо, Reason_mask имеет 9 ложных, а не истинных, поэтому я работаю точно так, как вы описали. Спасибо за помощь.

Julian Rubin 28.06.2019 09:58

Другие вопросы по теме