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();
        }
    }

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

Java解析证书内容相关推荐

  1. java 解析证书_java 读取证书类以及key tool gui 1.7

    Key Tool Gui 1.7 /** * Title: Light Weight APIs for crypto * Description: 一个上海CA证书(根证书和用户证书)进行处理的例子 ...

  2. java 解析证书吊销列表 crl

    所需证书吊销列表:https://pan.baidu.com/s/1gka42qZn8gsr5Y2tyZdmqw?pwd=6666 package org.example;import java.io ...

  3. JAVA解析PDF内容

    不废话,很简单,超实用.表格,图片都可以解析, 1下载**Spire.Pdf.jar**, 点击此处下载jar包 2代码 public static void main(String[] args) ...

  4. java 对证书文件以及秘钥.key的解析

    java解析证书具有两种方式, 1.为证书的标准格式,java通过jdk进行对标准证书进行base64解密转换.解析,由于网上对于该方式的描述较多,本文不做过多描述. 2.第二种方式为java去除了开 ...

  5. java解析excel的方法_Java解析Excel内容的方法

    本文实例讲述了Java解析Excel内容的方法.分享给大家供大家参考.具体实现方法如下: import java.io.File; import java.io.FileInputStream; im ...

  6. java 下载文件内容为空_java 下载文件 内容为空。

    Java日志使用slf4j 配置log4j后,有日志文件 但日志文件内容为空 SLF4J的全称是Simple Logging Facade for Java,即简单日志门面. SLF4J并不是具体的日 ...

  7. java解析pdf获取pdf中内容信息

    java解析pdf获取pdf中内容信息 今日项目中需要将pdf中的数据获取到进行校验数据,于是前往百度翻来覆去找到以下几种办法,做个笔记,方便日后查询. 废话不多说,我要直接上代码装逼了 第一种 使用 ...

  8. 计算机java工程师证书有哪些,java工程师证书怎么考?考工程师证书需要学什么内容?...

    在互联网的兴起中,更多的高薪的职业是吸引更多人加入其中的一个原因之一,对于很多的技术中证书也是可以带来薪资上的一个增加,今天我们就来说说"java 工程师证书怎么考"和" ...

  9. java 解析/读取 种子/bt/torrent 内容

    碰到不会的技术问题,我还是先度娘.能中文看懂,为什么非要看英文呢. java 解析/读取 种子/bt/torrent  内容,这个度娘给的满意答案并不是很多.GG之后的搜索结果出现了stackover ...

最新文章

  1. linux运维基础篇 unit14
  2. sixxpack破解的文章!【转】
  3. C++面试题-指针-指针数组与数组指针
  4. android之NDK version was not found
  5. Fortran入门教程(九)——文件
  6. win10+Ubuntu18.04双系统安装后无法进入win10或者无法进入Ubuntu的解决方案
  7. 软件测试报告有哪些内容?
  8. 部分更新没有安装 KB4535102
  9. word的大纲视图用法你晓得了吗
  10. 什么是BOM?BOM和DOM的区别
  11. 32.filter表案例 nat表应用 (iptables)
  12. Lenovo联想G460无电池ThinkPad强制刷新BIOS的方法,非电池补丁
  13. JavaScript滚动条插件源码
  14. 开关电源matlab仿真设计报告,MATLAB非隔离式开关电源仿真分析+源代码
  15. 如何快速成为谷歌web Store开发者(不用办visa/信用卡)
  16. 对接淘宝公共平台API
  17. VScode创建第一个C++项目
  18. win11正式版如何退回win10 windows11正式版退回win10的步骤方法
  19. 申请邓氏编码流程(创建苹果公司开发者账号必经之路~)
  20. 《Imperfect C++中文版》——1.2 编译期契约:约束

热门文章

  1. 锐捷防火墙RG-WALL 1600-M6600E配置
  2. Unity3D+SignalR实现实时数据传输
  3. 微信小程序流量主提升ecpm的一些方法
  4. 网络规划设计师怎么样
  5. 华为荣耀平板5怎么样_荣耀平板5配置如何?荣耀平板5优缺点评测
  6. 【财富空间】大风向!未来十年的12个必然趋势
  7. 【小技巧】使用百度搜索引擎搜指定站点内容
  8. 国家初中学生体质测试评分软件,国家学生体质健康标准评分表__小学,初中,高中...
  9. AP2403宽输入5——100V降压恒流车灯IC,内置MOS带短路保护功能
  10. Flutter中基于Dio实现Token Refresh