利用Java库函数和自己实现的解析算法来读取X.509证书

这篇博客介绍了如何使用Java自带库读取X.509证书字段,并探讨了证书数据格式的解析过程。作者分享了基本概念,算法思路,包括识别数据类型标识符、数据长度字段以及数据部分。虽然Java库函数简化了读取操作,但自定义解析可能面临证书扩展字段的挑战,尤其是对象标识符(OID)的解析。文中包含一个测试样例,并提供了部分代码参考。
摘要由CSDN通过智能技术生成

目录

Java自带库函数读取X.509证书字段

理解证书数据格式,然后解析

基本概念

算法思路

核心步骤


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方式,详细见此博客<

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值