В 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: Связь




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.
Хорошо, Reason_mask имеет 9 ложных, а не истинных, поэтому я работаю точно так, как вы описали. Спасибо за помощь.
Пожалуйста, покажите соответствующий код и точно укажите проблему или ошибку. Одного описания недостаточно. Также см. Как создать минимальный, полный и проверяемый пример.