java - CRL处理中比较interim_reasons_mask和reasons_mask的原因
问题描述
在6.3.3 中的RFC5280中。CRL 处理部分有一个步骤:
验证 interim_reasons_mask 是否包含一个或多个未包含在reasons_mask 中的原因。
有人可以解释这个检查的意义何在。当我尝试使用指向某个 URL 的分发点验证证书时,它在 DistributionPointFetcher:591 中失败。reasonMasks 设置为 9 true,所以我不明白如何通过此检查原因,因为它已被初始化,它从未更改过。
更新
初始化原因掩码的代码:链接
在 DistributionPointFetcher 中传递原因掩码以进行处理的代码:链接
解决方案
原因掩码: 此变量包含到目前为止处理的 CRL 和增量 CRL 支持的撤销原因集。
interim_reasons_mask: 这包含当前正在处理的 CRL 或增量 CRL 支持的一组撤销原因。
据我所知,此处理的目的是收集 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;
}
...
推荐阅读
- python - 在 Python 中使用 networkx 列出所有生成树
- angular - mat-button-toggle-checked in mat-button-toggle-group 如果它是连续的。角度 7+
- python - 空数据框python的分组问题
- r - 使用 dplyr 重命名数据帧列表中某些数据帧中的特定列名
- vue.js - 悬停时突出显示单个功能
- python - 如何使用python的随机模块从字符串中生成一串随机符号?
- python - 我该如何解决这个关于 Input 0 is incompatible with layer lstm_12: expected ndim=3, found ndim=2 的 ValueError?
- python - 仅当变量设置为“真”时如何使用“和”运算符
- sql - SQL Server 中带有 DATETIME 的 DISTINCT
- python - 使用python将元素附加到json字典中的标记