Java解析证书内容
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解析证书内容相关推荐
- java 解析证书_java 读取证书类以及key tool gui 1.7
Key Tool Gui 1.7 /** * Title: Light Weight APIs for crypto * Description: 一个上海CA证书(根证书和用户证书)进行处理的例子 ...
- java 解析证书吊销列表 crl
所需证书吊销列表:https://pan.baidu.com/s/1gka42qZn8gsr5Y2tyZdmqw?pwd=6666 package org.example;import java.io ...
- JAVA解析PDF内容
不废话,很简单,超实用.表格,图片都可以解析, 1下载**Spire.Pdf.jar**, 点击此处下载jar包 2代码 public static void main(String[] args) ...
- java 对证书文件以及秘钥.key的解析
java解析证书具有两种方式, 1.为证书的标准格式,java通过jdk进行对标准证书进行base64解密转换.解析,由于网上对于该方式的描述较多,本文不做过多描述. 2.第二种方式为java去除了开 ...
- java解析excel的方法_Java解析Excel内容的方法
本文实例讲述了Java解析Excel内容的方法.分享给大家供大家参考.具体实现方法如下: import java.io.File; import java.io.FileInputStream; im ...
- java 下载文件内容为空_java 下载文件 内容为空。
Java日志使用slf4j 配置log4j后,有日志文件 但日志文件内容为空 SLF4J的全称是Simple Logging Facade for Java,即简单日志门面. SLF4J并不是具体的日 ...
- java解析pdf获取pdf中内容信息
java解析pdf获取pdf中内容信息 今日项目中需要将pdf中的数据获取到进行校验数据,于是前往百度翻来覆去找到以下几种办法,做个笔记,方便日后查询. 废话不多说,我要直接上代码装逼了 第一种 使用 ...
- 计算机java工程师证书有哪些,java工程师证书怎么考?考工程师证书需要学什么内容?...
在互联网的兴起中,更多的高薪的职业是吸引更多人加入其中的一个原因之一,对于很多的技术中证书也是可以带来薪资上的一个增加,今天我们就来说说"java 工程师证书怎么考"和" ...
- java 解析/读取 种子/bt/torrent 内容
碰到不会的技术问题,我还是先度娘.能中文看懂,为什么非要看英文呢. java 解析/读取 种子/bt/torrent 内容,这个度娘给的满意答案并不是很多.GG之后的搜索结果出现了stackover ...
最新文章
- linux运维基础篇 unit14
- sixxpack破解的文章!【转】
- C++面试题-指针-指针数组与数组指针
- android之NDK version was not found
- Fortran入门教程(九)——文件
- win10+Ubuntu18.04双系统安装后无法进入win10或者无法进入Ubuntu的解决方案
- 软件测试报告有哪些内容?
- 部分更新没有安装 KB4535102
- word的大纲视图用法你晓得了吗
- 什么是BOM?BOM和DOM的区别
- 32.filter表案例 nat表应用 (iptables)
- Lenovo联想G460无电池ThinkPad强制刷新BIOS的方法,非电池补丁
- JavaScript滚动条插件源码
- 开关电源matlab仿真设计报告,MATLAB非隔离式开关电源仿真分析+源代码
- 如何快速成为谷歌web Store开发者(不用办visa/信用卡)
- 对接淘宝公共平台API
- VScode创建第一个C++项目
- win11正式版如何退回win10 windows11正式版退回win10的步骤方法
- 申请邓氏编码流程(创建苹果公司开发者账号必经之路~)
- 《Imperfect C++中文版》——1.2 编译期契约:约束
热门文章
- 锐捷防火墙RG-WALL 1600-M6600E配置
- Unity3D+SignalR实现实时数据传输
- 微信小程序流量主提升ecpm的一些方法
- 网络规划设计师怎么样
- 华为荣耀平板5怎么样_荣耀平板5配置如何?荣耀平板5优缺点评测
- 【财富空间】大风向!未来十年的12个必然趋势
- 【小技巧】使用百度搜索引擎搜指定站点内容
- 国家初中学生体质测试评分软件,国家学生体质健康标准评分表__小学,初中,高中...
- AP2403宽输入5——100V降压恒流车灯IC,内置MOS带短路保护功能
- Flutter中基于Dio实现Token Refresh