RSA、SM2公钥证书信息的读取

        前言:在开发过程中,经常会需要使用来进行签名、验签等操作。通常情况下,国际算法会使用RSA算法公钥证书,而随着国密算法的升级普及,及数据安全的更高的要求下,需要进行一系列的升级改造。

        必要情况下,会需要知道相关证书的证书信息,如:证书序列号、证书有效期、证书拥有者等。

        相关信息的读取详细操作代码,如下所示。

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import sun.misc.BASE64Encoder;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.security.PublicKey;
import java.security.Security;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CertManagerBC {
    public static void main(String[] args) {
        CertManagerBC certManager = new CertManagerBC();
        certManager.showCertInfo();
    }
    public static void showCertInfo() {
        try {
            // 读取证书文件
            String filePath = "D:\\工作资料\\国密改造\\测试SM2签名证书.cer";
            // String filePath = "D:\\工作资料\\国密改造\\测试RSA签名证书.cer";
            File file = new File(filePath);
            InputStream inStream = new FileInputStream(file);
 
            // 引入BC库  证书类型是SM2证书时使用             
            Security.addProvider(new BouncyCastleProvider());
            // 创建X509工厂类
            CertificateFactory cf = CertificateFactory.getInstance("X.509","BC");

            // 证书类型是RSA证书时使用
            // 创建X509工厂类
            // CertificateFactory cf = CertificateFactory.getInstance("X.509");

            // 创建证书对象
            X509Certificate oCert = (X509Certificate) cf.generateCertificate(inStream);
            PublicKey pk = oCert.getPublicKey();
            BASE64Encoder bse= new BASE64Encoder();
            System.out.println("Base64公钥信息:\n"+bse.encode(pk.getEncoded()));
            System.out.println("----------------------------");
            inStream.close();
            SimpleDateFormat dateformat = new SimpleDateFormat("yyyy/MM/dd");
            String info = null;
            // 获得证书版本
            info = String.valueOf(oCert.getVersion());
            System.out.println("证书版本:" + info);
            // 获得证书序列号
            info = oCert.getSerialNumber().toString(16);
            System.out.println("证书序列号:" + info);
            // 获得证书有效期
            Date beforedate = oCert.getNotBefore();
            info = dateformat.format(beforedate);
            System.out.println("证书生效日期:" + info);
            Date afterdate = oCert.getNotAfter();
            info = dateformat.format(afterdate);
            System.out.println("证书失效日期:" + info);
            // 获得证书主体信息
            info = oCert.getSubjectDN().getName();
            System.out.println("证书拥有者:" + info);
            // 获得证书颁发者信息
            info = oCert.getIssuerDN().getName();
            System.out.println("证书颁发者:" + info);
            // 获得证书签名算法名称
            info = oCert.getSigAlgName();
            System.out.println("证书签名算法:" + info);
        } catch (Exception e) {
            System.out.println("解析证书出错!");
            e.printStackTrace();
        }
    }
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值