目录
Java自带库函数读取X.509证书字段
这个很简单,直接上代码。读取然后全部输出,或者输出对应字段。
import java.security.*;
import java.security.cert.*;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
// 使用自带库函数读取X.509证书
private static void readX_509(String certificateName){
try{
CertificateFactory CF = CertificateFactory.getInstance("X.509"); // 从证书工厂中获取X.509的单例类
FileInputStream fileIn = new FileInputStream(certificateName); // 将证书读入文件流
Certificate C = CF.generateCertificate(fileIn); // 将文件流的证书转化为证书类
String certificateStr = C.toString();
System.out.println("使用[自带库函数]读入证书结果如下:");
System.out.print(certificateStr);
System.out.println("--------------------------------------\n证书主要字段:");
X509Certificate cer = (X509Certificate)C;
System.out.println("版本号:" + cer.getVersion());
System.out.println("序列号:" + cer.getSerialNumber().toString());
System.out.println("颁发者:" + cer.getSubjectDN());
// System.out.println("颁发者唯一标识符: " + cer.getSubjectUniqueID().toString());
System.out.println("使用者:" + cer.getIssuerDN());
// System.out.println("使用者唯一标识符: " + cer.getIssuerUniqueID().toString());
System.out.println("有效期:from:" + cer.getNotBefore() + " to: " + cer.getNotAfter());
System.out.println("签发算法" + cer.getSigAlgName());
System.out.println("签发算法ID:" + cer.getSigAlgOID());
System.out.println("证书签名:" + cer.getSignature().toString());
byte [] sig = cer.getSigAlgParams();
PublicKey pk = cer.getPublicKey();
byte [] pkenc = pk.getEncoded();
System.out.println("公钥:");
for(int i = 0; i < pkenc.length; i++){
System.out.print(pkenc[i]);
}
}
catch(Exception e){
e.printStackTrace();
}
}
理解证书数据格式,然后解析
网上相关的代码太少了,估计大家都用比较成熟的库函数,很少人自己去体会实际的证书内部数据格式,以及解析的方式。以下内容仅供参考,大致可以获取基本证书字段,不同证书扩展字段不一样,所以扩展字段的解析不是很理想。不过有一份完备详细的证书数据结构文档的话,按照本文思路花点功夫也可以实现完整解析。
基本概念
证书编码方式为ANS1方式,详细见此博客<