我有一个CRL和一个作为CA证书的自签名证书.我需要验证同一个CA是否在Java中同时颁发了CRL和根证书。我的想法是:
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。我该怎么做?或者,与我的想法相反,这种方法是对的吗?
谢谢!
发布于 2015-06-18 05:44:02
正如@frasertweedale所提到的,证书颁发机构和CRL颁发机构不一定是相同的。不过,没有太多理由将CRL的发布授权给另一个机构,而且并非所有的系统都支持这一点。例如,Windows链验证代码只支持由颁发CRL所涵盖的证书的同一个CA (签名)发出的CRLs。
通常,验证逻辑由两部分组成,如下所示:
CRLDistributionPoints序列上循环。如果存在具有呈现cRLIssuer结构的条目,则由此分发点引用的CRL由cRLIssuer字段中指定的实体签名。如果未显示cRLIssuer字段,则证书和CRL由相同的CA签名,并在distributionPointName字段中指定CRL位置。针对发行者的CRL验证分为两个步骤:
Subject字段中的Subject字段进行二进制(而不是字符串)比较。如果比较失败,则CRL无效。更多关于CRL分布点、扩展、组合和处理规则的信息:RFC 5280§4.2.1.13
发布于 2018-02-16 08:46:27
请注意,由于Java8有一种验证证书链(包括CRL检查)的方法,请参见此处:Java证书撤销检查。
如果使用自签名证书,则确实需要确保正确填充涉及各方的密钥/信任存储(默认仙人掌)。
我认为,对问题名称进行字符串比较是一种非常薄弱的方法。
发布于 2015-06-18 02:39:33
如果签发人在CA证书和CRL上的名称不同,则必须被视为是由不同的发行人签发的。如果在生成CRL或任何其他有符号对象时,Issuer的比特“丢失”,那么这就违反了X.509和bug。
请注意,CA可能将CRL签名委托给下属CRL颁发机构,因此通用CRL验证函数必须处理这种情况,以及直接CRL签发。
https://stackoverflow.com/questions/30903993
复制相似问题