项目原来设计只要求读取CRL中吊销列表的序列号和吊销日期,所以并未考虑排序的问题,但是后来又要求按照吊销日期进行排序。
下面是原来的程序,显示出来的吊销列表顺序是乱的,和证书上的顺序不一致。
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509CRL crl = (X509CRL)cf.generateCRL(new FileInputStream("c:\\1.crl"));
//读取版本号
int version = crl.getVersion();
//读取颁发者DN
String issuerDN = crl.getIssuerDN().toString();
//读取生效日期
Date startTime = crl.getThisUpdate();
//读取下一次更新日期
Date nextUpdateTime = crl.getNextUpdate();
//读取吊销列表
Set tSet = crl.getRevokedCertificates();
Iterator tIterator = tSet.iterator();
while(tIterator.hasNext()){
X509CRLEntry tEntry = (X509CRLEntry) tIterator.next();
//读取序列号
String sn = getSerialNumber(tEntry);
//读取吊销日期
String time = tEntry.getRevocationDate().toLocaleString();
}
根据吊销列表中的每个对象获得序列号的字符串值,entry.getSeriaNumber()读取出来是BigInteger,可读性不好也不直观,所以下面的方法将其转换成字符串,并且和证书上显示的序列号相同。
public static String getSerialNumber(X509CRLEntry entry){
if(entry != null){
byte[] serial = entry.getSerialNumber().toByteArray();
if(serial.length>0){
String serialNumberString = new String();
for(int i=0;i<serial.length;i++){
String s =Integer.toHexString(Byte.valueOf(serial[i]).intValue());
if(s.length()==8){
s = s.substring(6);
}else if(1==s.length()){
s="0"+s;
}
serialNumberString+=s+" ";
}
return serialNumberString;
}
}
return null;
}
现在要对集合进行排序,需要实现Comparator类的compare方法,当吊销日期相同时按照序列号自然排序。
注意:排序方法很重要,如果只比较吊销日期,不做compare==0判断的话,使用第一种方法即TreeSet,最后输出结果可能有误,会导致丢失吊销证书信息的情况。因为TreeSet基于Set接口,虽然可以排序,但是仍然不允许元素重复。第二种方法即List接口允许元素重复,所以不会出现这种情况。
public class CRLDateComparator implements Comparator {
public int compare(Object o1, Object o2){
X509CRLEntry entry1 = (X509CRLEntry)o1;
X509CRLEntry entry2 = (X509CRLEntry)o2;
int compare = entry1.getRevocationDate().compareTo(entry2.getRevocationDate());
if(compare == 0){
String sn1 = getSerialNumber(entry1);
String sn2 = getSerialNumber(entry2);
compare = sn1.compareTo(sn2);
}
return compare;
}
实现方法有2种:TreeSet和List。
第一种 TreeSet
Set tSet = crl.getRevokedCertificates();
//----------加入代码开始----------
TreeSet ts = new TreeSet(new CRLDateComparator());
ts.addAll(set);
//----------加入代码结束----------
Iterator tIterator = ts.iterator();
第二种 List
Set tSet = crl.getRevokedCertificates();
//----------加入代码开始----------
List l = new ArrayList();
l.addAll(set);
Collections.sort(l, new CRLDateComparator());
//----------加入代码结束----------
Iterator tIterator = l.iterator();
以上两种方法经过测试,都可以满足要求。
分享到:
相关推荐
当一个证书被撤销时,CA会将该证书的序列号添加到CRL中,并在CRL中提供发布日期、过期日期以及如何获取最新的CRL信息等。客户端在验证证书有效性时,除了检查证书的签名和有效期外,还会查询CRL以确认该证书是否已被...
这个"JAVA版证书吊销列表CRL解析工具"是一个专门用于检索CRL中证书序列号的实用程序。它的功能在于帮助用户快速从CRL文件中提取序列号,并将这些信息导出到TXT文本文件中。这对于监控和管理证书状态、确保网络通信的...
这份文档“行业文档-设计装置-数字证书的证书吊销列表缓存及查询方法”着重讨论了如何管理和查询数字证书的证书吊销列表(CRL,Certificate Revocation List)以及相关的缓存策略,以确保网络通信的安全和高效。...
crl_monitor 证书吊销列表监视器
4. **Collections工具类**: Java标准库中的Collections类提供了许多静态方法,用于操作列表,如排序、查找、复制等。这些方法对任何实现List接口的类都适用。 5. **JavaFX和Swing的ListView组件**: 如果需要在图形...
针对这种情况,"CRL中的金钱货币数据类型"这个程序旨在填补这一空白,为开发者提供一个专门用于处理货币值的数据结构,从而简化涉及金融计算的程序开发。 在C#编程语言中,虽然没有内建的货币类型,但通常会使用`...
Elixir中的"x509"软件包是专门设计来处理这种证书及其相关组件的工具,包括证书签名请求(CSR)、证书吊销列表(CRL)以及RSA和ECC(椭圆曲线加密)密钥对。 首先,我们来深入理解X.509证书。X.509证书是包含公开...
证书吊销列表 (Certificate Revocation List ,简称: CRL) 是 PKI 系统中的一个结构化数据文件,该文件包含了证书颁发机构 (CA) 已经吊销的证书的序列号及其吊销日期。 CRL 文件中还包含证书颁发机构信息、吊销列表...
CRL,全称为“证书吊销列表”(Certificate Revocation List),是数字证书管理体系中的一个重要概念。在IT安全领域,尤其是网络安全中,CRL扮演着关键角色,它用于标识已经失效或者不再可信的数字证书。当一个证书...
在计算机安全领域,数字证书和证书注销列表(CRL)是维护网络通信安全的重要组成部分。了解证书和CRL的结构及扩展有助于更好地理解证书的管理和使用。 数字证书是由认证机构(CA)颁发的一种电子文档,用于证明实体...
每个证书都有一个序列号,当证书被发现存在安全问题或者不再有效时,CA会将该证书的序列号放入CRL中。系统在验证证书有效性时,会去CRL发布点下载最新的CRL,并检查待验证证书的序列号是否在列表内。如果在,那么...
数据连接以编程方式进行配置,支持多个数据库,参见Global.asax中实现,首次使用请更改LocalSqlHelper.CreateDbHelper中数据连接 通过业务对象封装继承,实现业务重用性,比较常用的封装有,会员/账户系统,字典配置,分类...
数据连接以编程方式进行配置,支持多个库,参见Global.asax中实现,首次使用请更改LocalSqlHelper.CreateDbHelper中数据连接 通过业务对象封装继承,实现业务重用性,比较常用的封装有,会员/账户系统,字典配置,分类系统,...
总的来说,"crl_timer.zip"提供的库是一个强大的工具,可以帮助开发者在各种平台上实现复杂的时间控制需求,无论是在游戏开发、网络编程还是其他实时应用中,都能发挥重要作用。使用它,开发者可以专注于业务逻辑,...
数据连接以编程方式进行配置,支持多个库,多种数据库类型,参见Global.asax中实现,首次使用请更改LocalSqlHelper.CreateDbHelper中数据连接 通过业务对象封装继承,实现业务重用性,比较常用的封装有,会员/账户系统,字典...
当客户端与使用`mod_sslcrl`的Apache服务器建立SSL连接时,服务器会检查客户端提供的数字证书是否在CRL列表中被吊销。`mod_sslcrl`模块会自动从证书颁发机构(CA)指定的URL下载最新的CRL文件,确保始终使用的是最新...
在STM32中,CRH、CRL、ODR和IDR寄存器是GPIO(通用输入/输出)模块的重要组成部分,用于管理GPIO端口的配置和状态。以下是对这些寄存器的详细解释: 1. CRL(Control Register Low)和CRH(Control Register High)...
这三份文档集构成了神州数码DCC-CRL1000 (R2.0)云服务实训平台的全方位使用教程,专为中职学校提供网络搭建及服务器虚拟化实训支持。产品彩页概述了平台的主要特性,包括强大的硬件配置、自动化部署、资源调度与监控...
但考虑系统负荷,用户的吊销请求会被暂时记录,然后以天为单位更新,客户端可以通过 CRL Distribution Point(CRL 分发点:本系统分发点为:CRL Distribution Point)获取最新的 CRL 列表。 证书审核:用户的证书...
它可以帮助开发者检查证书是否在CRL列表中,从而避免与使用了已被撤销的证书的服务器进行通信,保护用户的数据安全。此外,该库可能还支持在线更新CRL,以确保检查的实时性。 在Python后端开发中,正确处理证书验证...