项目原来设计只要求读取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();
以上两种方法经过测试,都可以满足要求。
分享到:
相关推荐
证书吊销列表CRL解析工具(Java)
快速检索crl里的证书序列号,转储到txt文件里,内有详细说明文档
crl_monitor 证书吊销列表监视器
x509:Elixir软件包,用于处理X.509证书,证书签名请求(CSR),证书吊销列表(CRL)和RSAECC密钥对
这个程序提供了一个数据结构,用以处理CRL中一直缺乏的金钱货币数据类型。从而简化程序的开发。
证书吊销列表 (Certificate Revocation List ,简称: CRL) 是 PKI 系统中的一个结构化数据文件,该文件包含了证书颁发机构 (CA) 已经吊销的证书的序列号及其吊销日期。 CRL 文件中还包含证书颁发机构信息、吊销列表...
mod_sslcrl是用于Apache Web服务器的模块,该模块实现CRL(证书吊销列表)验证,并自动从相应的CA下载新的CRL文件。
数据连接以编程方式进行配置,支持多个数据库,参见Global.asax中实现,首次使用请更改LocalSqlHelper.CreateDbHelper中数据连接 通过业务对象封装继承,实现业务重用性,比较常用的封装有,会员/账户系统,字典配置,分类...
数据连接以编程方式进行配置,支持多个库,参见Global.asax中实现,首次使用请更改LocalSqlHelper.CreateDbHelper中数据连接 通过业务对象封装继承,实现业务重用性,比较常用的封装有,会员/账户系统,字典配置,分类系统,...
数据连接以编程方式进行配置,支持多个库,多种数据库类型,参见Global.asax中实现,首次使用请更改LocalSqlHelper.CreateDbHelper中数据连接 通过业务对象封装继承,实现业务重用性,比较常用的封装有,会员/账户系统,字典...
详细介绍了证书及CRL的各扩展释义,有助于加深对证书的了解
java在线列表
该存储库包含Java 8的证书吊销列表(CRL)分发点和在线证书状态协议(OCSP)响应程序的实现。 概述 此应用程序是Dropwizard应用程序,可以响应给定CA的CRL请求和OCSP请求。 您需要为应用程序提供对CA索引文件的访问...
但考虑系统负荷,用户的吊销请求会被暂时记录,然后以天为单位更新,客户端可以通过 CRL Distribution Point(CRL 分发点:本系统分发点为:CRL Distribution Point)获取最新的 CRL 列表。 证书审核:用户的证书...
吊销端点 主机列表可阻止已知的CRL服务器和OCSP响应程序。 博客文章: :
crl
但考虑系统负荷,用户的吊销请求会被暂时记录,然后以天为单位更新,客户端可以通过 CRL Distribution Point(CRL 分发点:本系统分发点为:CRL Distribution Point)获取最新的 CRL 列表。 证书审核:用户的证书...
C/C++实现的跨平台高精度定时器,可以用实现动画,定时器队列等功能。
CRL服务器基于 Java、Hibernate、DBUnit 和 Maven 的 CRL(证书撤销列表)服务器聚合器
论文研究-PKI中CRL撤消延迟的研究.pdf, 首先建立了使用 CRL发布证书撤消信息的数学模型 .在对模型进行分析得基础上 ,对撤消延迟进行了分析 ,得到了撤消延迟的表达式并...