Java解析证书内容

news/2024/7/12 3:18:50 标签: https, http, ssl

Java解析证书获取证书内部信息,在证书交换环节中常使用,网络上也提供很多参考方案,本文主要是提供证书base64格式解析和证书路径解析证书内容。在解析时可能会遇到一些问题,后面根据情况再具体说明。

首先提供的是解析base64格式证书

引入pom依赖

<dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcpkix-jdk15on</artifactId>
            <version>1.70</version>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.70</version>
        </dependency>

编写公共方法

import org.bouncycastle.asn1.*;
import org.bouncycastle.asn1.x509.*;
import org.bouncycastle.util.encoders.Hex;
import sun.misc.BASE64Decoder;
import java.io.*;
import java.security.cert.*;
import java.util.HashMap;


public class CertUtil {

    /**
     * x509证书解析
     *
     * @param
     * @return
     */
    public static void getCertInfo(byte[] Cert)  {
        InputStream inStream = new ByteArrayInputStream(Cert);
        ASN1Sequence seq;
        ASN1InputStream aIn;
        try{
            aIn = new ASN1InputStream(inStream);
            seq = (ASN1Sequence)aIn.readObject();
            X509CertificateStructure cert = new X509CertificateStructure(seq);

            String endDate = cert.getEndDate().getTime();
            String startDate = cert.getStartDate().getTime();
            System.out.println("endDate============="+endDate);
            System.out.println("startDate============="+startDate);
            int version = cert.getVersion();
            System.out.println("cert.getVersion()============="+cert.getVersion());
            X509Name issuer = cert.getIssuer();
            X509Name subject = cert.getSubject();
            System.out.println("issuer============="+issuer);
            System.out.println("subject============="+subject);
            String serialNumber = cert.getSerialNumber().getValue().toString(16);
            System.out.println("serialNumber============="+serialNumber);
            DERBitString signature = cert.getSignature();
            String sign = new String(Hex.encode(signature.getBytes()));
            System.out.println("sign============="+sign);
            SubjectPublicKeyInfo publicKeyInfo = cert.getSubjectPublicKeyInfo();
            String algId = publicKeyInfo.getAlgorithmId().getObjectId().getId();
            System.out.println("algId============="+algId);
           byte[]  byPuk = publicKeyInfo.getPublicKeyData().getBytes();
           String publicKey = new String(Hex.encode(byPuk));
            System.out.println("publicKey============="+publicKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * x509证书解析 重载
     *
     * @param cert
     * @return
     */
    public static HashMap<String, Object> getCert(String cert) {
        cert = cert.replaceAll("\r", "");
        cert = cert.replaceAll("\n", "");
        cert = cert.replace("-----BEGIN CERTIFICATE-----", "");
        cert = cert.replace("-----END CERTIFICATE-----", "");

        BASE64Decoder decoder = new BASE64Decoder();
        try {
            return getCertInfo(decoder.decodeBuffer(cert));
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }
}

证书路径解析证书

引入pom依赖

<dependency>
   <groupId>org.bouncycastle</groupId>
   <artifactId>bcprov-jdk15on</artifactId>
   <version>1.61</version>
</dependency>
<dependency>
   <groupId>org.bouncycastle</groupId>
   <artifactId>bcprov-jdk15on</artifactId>
   <version>1.67</version>
</dependency>

编写公共方法

 public static HashMap<String, Object>  getCertCate(String certPath) {
        HashMap<String, Object> certinfo = new HashMap<>();
        try{
            // 引入BC库
            Security.addProvider(new BouncyCastleProvider());
            // 使用BC解析X.509证书
            CertificateFactory CF = CertificateFactory.getInstance("X.509", "BC"); // 从证书工厂中获取X.509的单例类
            InputStream fileIn = new FileInputStream(certPath); // 将本地证书读入文件流
            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 publicKey = cer.getPublicKey();
            byte [] pkenc = publicKey.getEncoded();
            System.out.println("解析出的公钥:" + Base64.getEncoder().encodeToString(pkenc));
            System.out.println("公钥:");
            for(int i = 0; i < pkenc.length; i++){
                System.out.print(pkenc[i]);
            }
        } catch(Exception e){
            e.printStackTrace();
        }
    }

两种方法都可以实现证书的解析,但是它们的依赖不同,没有配置相应的依赖,解析证书会失败,而且版本高的依赖貌似并不支持低版本依赖,有兴趣的可以研究是否不同依赖之间可以兼容。


http://www.niftyadmin.cn/n/1669605.html

相关文章

mysql 7天自动拒单功能_MySQL自动备份和手工恢复(可实现定时备份、保留最近7天、异地备份)...

以下是windows下的批处理&#xff1a;1set hour_str%time:~0,2%2if "%hour_str:~0,1%"" " set "hour_str0%hour_str:~1%"3set fileName%date:~0,4%-%date:~5,2%-%date:~8,2%_%hour_str%%time:~3,2%%time:~6,2%4D:5cd D:\autobak\6mysqldump 数据…

vue实现下载功能

在之前的文章中有写过上传附件、生成静态页面和pdf格式的文章&#xff0c;本文主要是记录下载的内容&#xff0c;一下摘录的都是一些关键代码。 相关页面控件内容 <el-tooltip effect"dark" content"下载证书" placement"top"> …

mysql ibdata1 解析_MySQL数据表InnoDB引擎表误删恢复(共享表空间ibdata1)

这世界上有后悔药-www.houhuiyao.cc 后悔药MySQL数据恢复 站长语上一篇介绍MySQL数据恢复的文章MySQL数据表InnoDB引擎表误删恢复(独立表空间innodb_file_per_table1)&#xff0c;是基于独立表空间的情况下的恢复。本文将介绍基于共享表空间的数据恢复 。先来看下独立表空间和共…

@Autowried注解无法注入问题解决

在新建的方法类中&#xff0c;需要用Autowried注解注入&#xff0c;但是在运用中&#xff0c;却会发现引入的对象为null&#xff0c;针对这个问题&#xff0c;收集了部分资料&#xff0c;在此做个分享&#xff1a; 如果想在生成对象时完成某些初始化操作&#xff0c;而偏偏这些…

java框架视频_Java视频教程:Mybatis由浅入深教程

教程介绍强调下越来越多的企业开始选择springmvcmybatis来构建系统架构&#xff0c;在电商热门的今天&#xff0c;springmvcmybatis已成为电商项目架构的很好搭配。Springmvc和struts2都属于表现层的框架&#xff0c;springmvc是Spring框架的一部分&#xff0c;较于struts2框架…

vue 校验(邮箱、身份证、手机号、IP、端口)

在前端&#xff0c;运用vue开发&#xff0c;总是会有校验的情况发生&#xff0c;虽然可以通过正则规则写出需要的表达式&#xff0c;但是如果遇到重复的&#xff0c;总是一直查找&#xff0c;一直编写&#xff0c;也是耗神耗时耗事的&#xff0c;所以在这里整理了一些在我自己工…

Java 校验信息(IP、端口、邮箱,手机号码、身份证)

收集网络资源&#xff0c;整理部分java校验代码&#xff0c;以便后续可以直接使用&#xff0c;大家可以参考&#xff0c;减少查阅网络资源时间。 import java.util.regex.Matcher; import java.util.regex.Pattern;public class ValidateByReg {/*** 判断是否为合法IP * return…

java数据结构与算法_浅谈Java数据结构和算法

今天的突然看集合底层的时候发现了好多算法和数据结构。再次就比较一下和汇总一下。数据结构分类&#xff1a;线性结构和非线性结构问题一&#xff1a;什么是线性和非线性&#xff1b;我个人的理解是&#xff1a;数据结构中线性结构指的是数据元素之间存在着“一对一”的线性关…