首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的CRL验证

Java中的CRL验证
EN

Stack Overflow用户
提问于 2015-06-17 23:10:37
回答 3查看 6.5K关注 0票数 0

我有一个CRL和一个作为CA证书的自签名证书.我需要验证同一个CA是否在Java中同时颁发了CRL和根证书。我的想法是:

代码语言:javascript
复制
X500Principal rootCertIssuer = rootCertificate.getIssuerX500Principal();
X500Principal crlIssuer = crl.getIssuerX500Principal();
    if(rootCertIssuer.getName().equals(crlIssuer.getName()))
    System.out.println("Issuer same!");
else
    System.out.println("Issuer different!");

这似乎不对,因为如果CRL或根证书中缺少国家/州信息,equals()将返回一个false。我该怎么做?或者,与我的想法相反,这种方法是对的吗?

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-18 05:44:02

正如@frasertweedale所提到的,证书颁发机构和CRL颁发机构不一定是相同的。不过,没有太多理由将CRL的发布授权给另一个机构,而且并非所有的系统都支持这一点。例如,Windows链验证代码只支持由颁发CRL所涵盖的证书的同一个CA (签名)发出的CRLs。

通常,验证逻辑由两部分组成,如下所示:

  1. 读取证书的CDP (CRL分发点)扩展(非根)并在CRLDistributionPoints序列上循环。如果存在具有呈现cRLIssuer结构的条目,则由此分发点引用的CRL由cRLIssuer字段中指定的实体签名。如果未显示cRLIssuer字段,则证书和CRL由相同的CA签名,并在distributionPointName字段中指定CRL位置。
  2. 下载(或使用其他方式下载CRL) CRL (必要时使用CRL颁发者证书)并启动CRL验证例程。

针对发行者的CRL验证分为两个步骤:

  1. 首先,需要对CRL颁发者证书的CRL字段和Subject字段中的Subject字段进行二进制(而不是字符串)比较。如果比较失败,则CRL无效。
  2. 使用CRL颁发者证书的公钥验证CRL签名。如果签名验证失败,则CRL无效。

更多关于CRL分布点、扩展、组合和处理规则的信息:RFC 5280§4.2.1.13

票数 1
EN

Stack Overflow用户

发布于 2018-02-16 08:46:27

请注意,由于Java8有一种验证证书链(包括CRL检查)的方法,请参见此处:Java证书撤销检查

如果使用自签名证书,则确实需要确保正确填充涉及各方的密钥/信任存储(默认仙人掌)。

我认为,对问题名称进行字符串比较是一种非常薄弱的方法。

票数 2
EN

Stack Overflow用户

发布于 2015-06-18 02:39:33

如果签发人在CA证书和CRL上的名称不同,则必须被视为是由不同的发行人签发的。如果在生成CRL或任何其他有符号对象时,Issuer的比特“丢失”,那么这就违反了X.509和bug。

请注意,CA可能将CRL签名委托给下属CRL颁发机构,因此通用CRL验证函数必须处理这种情况,以及直接CRL签发。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30903993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档