BouncyCastleProvider 对 X.509 证书的生成

文章目录

  • 前言
    • BouncyCastleProvider 对 X.509 证书的生成
      • 1. demo

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


BouncyCastleProvider 对 X.509 证书的生成

在这里说一下,为什么要用BouncyCastleProvider 来对证书的生成。
看下面截图:

keytool -list -v -keystore yzy.p12 -storetype PKCS12 -storepass yzy@yzy

win10 系统
在这里插入图片描述
linux系统
在这里插入图片描述
相同的p12证书在不同的环境,不一定都可以用,对于我这边的java服务来说,如果用BouncyCastleProvider 生成,基本上就不会有问题。

1. demo

package org.example.controller;import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.PEMKeyPair;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
import org.bouncycastle.pkcs.PKCS8EncryptedPrivateKeyInfo;
import org.bouncycastle.pkcs.PKCSException;
import org.bouncycastle.util.io.pem.PemObject;
import org.bouncycastle.util.io.pem.PemReader;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.security.KeyFactory;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.Security;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.spec.PKCS8EncodedKeySpec;public class Test {static {Security.addProvider(new BouncyCastleProvider());}public static void main(String[] args) throws Exception {String certFile = "F:/中间件/docker_p12/window/yzy.crt";String keyFile = "F:/中间件/docker_p12/window/yzy.key";String p12File = "F:/中间件/docker_p12/window/yzy.p12";String password = "yzy@yzy";// Load certificateCertificateFactory cf = CertificateFactory.getInstance("X.509");try (FileReader certInputStream = new FileReader(certFile);PemReader certPemReader = new PemReader(certInputStream)) {PemObject certPemObject = certPemReader.readPemObject();X509Certificate cert = (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(certPemObject.getContent()));// Load private keyPemReader keyPemReader = new PemReader(new FileReader(keyFile));Object pemObject = new PEMParser(keyPemReader).readObject();PrivateKey privateKey = null;if (pemObject instanceof PEMKeyPair) {PEMKeyPair pemKeyPair = (PEMKeyPair) pemObject;privateKey = new JcaPEMKeyConverter().getPrivateKey(pemKeyPair.getPrivateKeyInfo());} else if (pemObject instanceof PKCS8EncryptedPrivateKeyInfo) {PKCS8EncryptedPrivateKeyInfo encryptedPrivateKeyInfo = (PKCS8EncryptedPrivateKeyInfo) pemObject;privateKey = new JcaPEMKeyConverter().getPrivateKey(encryptedPrivateKeyInfo.decryptPrivateKeyInfo(null));} else if (pemObject instanceof PrivateKeyInfo) {PrivateKeyInfo privateKeyInfo = (PrivateKeyInfo) pemObject;privateKey = new JcaPEMKeyConverter().getPrivateKey(privateKeyInfo);} else if (pemObject instanceof PemObject) {PemObject pem = (PemObject) pemObject;String type = pem.getType();System.out.println("PemObject type: " + type);if ("PRIVATE KEY".equals(type)) {PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(pem.getContent());KeyFactory keyFactory = KeyFactory.getInstance("RSA");privateKey = keyFactory.generatePrivate(keySpec);} else {throw new IllegalArgumentException("Unknown private key format");}} else {System.out.println("PemObject class: " + pemObject.getClass().getName());throw new IllegalArgumentException("Unknown private key format");}// Create PKCS12 keystoreKeyStore pkcs12Store = KeyStore.getInstance("PKCS12", "BC");pkcs12Store.load(null, null);pkcs12Store.setKeyEntry("yzy", privateKey, password.toCharArray(), new Certificate[]{cert});// Save to .p12 filetry (FileOutputStream fos = new FileOutputStream(p12File)) {pkcs12Store.store(fos, password.toCharArray());}} catch (PKCSException e) {System.err.println("Error decrypting private key info: " + e.getMessage());} catch (IOException e) {System.err.println("IO error: " + e.getMessage());}}
}

测试:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3225323.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java中的SSM框架实现水稻朔源信息系统项目【项目源码】

基于Java中的SSM框架实现水稻朔源信息系统演示 SSM框架 SSM框架是基于Spring、SpringMVC以及Mybatis实现的针对JAVA WEB端应用的开发框架,通过SSM框架结构可以实现以上三种框架的优点集合,从而实现更加高效便捷的系统开发和呈现。该框架结构通过Spring框…

路径规划 | 基于蚁群算法的三维无人机航迹规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 基于蚁群算法的三维无人机航迹规划(Matlab)。 蚁群算法(Ant Colony Optimization,ACO)是一种模拟蚂蚁觅食行为的启发式算法。该算法通过模拟蚂蚁在寻找食物时…

面向对象特征

面向对象三大特征:封装、继承、多态。 方法 假设有两个方法,一个方法的接收者,是指针类型,一个方法的接收者是值类型, 那么: 对于值传递的变量和指针类型的变量,这两个方法的区别 如果这两个…

文本引导I2I迈向统一!北大王选所提出FCDiffusion:端到端适用于各种图像转换任务

文章链接:https://arxiv.org/pdf/2407.03006 github地址:https://github.com/XiangGao1102/FCDiffusion 最近,大规模的文本到图像(T2I)扩散模型在图像到图像(I2I)转换中展现出强大的能力,允许通过用户提供的文本提示进行开放域的图…

Kithara和OpenCV (一)

Kithara使用 OpenCV 目录 Kithara使用 OpenCV简介需求和支持的环境构建 OpenCV 库使用 CMake 进行配置以与 Kithara 一起工作 使用 OpenCV 库设置项目运行 OpenCV 代码图像采集和 OpenCV自动并行化限制和局限性1.系统建议2.实时限制3.不支持的功能和缺失的功能4.显示 OpenCV 对…

设计模式之Facade设计模式

Facade设计模式,也称为外观模式,是一种结构型设计模式,它主要用于为子系统中的一组接口提供一个统一的高层接口,从而使得子系统更加容易使用。以下是关于Facade设计模式的详细介绍: 一、定义 Facade模式为多个复杂的…

XTuner 微调 LLM:1.8B, 部署

扫码立刻参与白嫖A100,书生大模型微调部署学习活动。亲测有效 内容来源:Tutorial/xtuner/personal_assistant_document.md at camp2 InternLM/Tutorial GitHubLLM Tutorial. Contribute to InternLM/Tutorial development by creating an account on G…

Mattermost:一个强大的开源协作平台

Mattermost是一个强大的开源协作平台,基于云原生架构,为企业级用户提供安全、可扩展且自托管的消息传递解决方案。 一、平台特点 开源与定制性:Mattermost是一个开源项目,用户可以根据自身需求定制界面、添加功能或扩展其功能&am…

深入探索大语言模型

深入探索大语言模型 引言 大语言模型(LLM)是现代人工智能领域中最为重要的突破之一。这些模型在自然语言处理(NLP)任务中展示了惊人的能力,从文本生成到问答系统,无所不包。本文将从多个角度全面介绍大语…

文字识别 -- eSearch v1.12.1

软件简介 eSearch是一款功能强大的跨平台软件工具,主要功能包括截屏、OCR文字识别、搜索、翻译、贴图、以图搜图以及录屏等。它不仅支持多屏幕、窗口和控件选择、长截屏等高级截屏功能,还支持离线和在线OCR服务,可进行自定义OCR模型和字典设…

【基于R语言群体遗传学】-15-溯祖理论coalescence

在群体遗传学中,一个非常重要的概念是关注谱系的汇聚(遗传线索的汇合),当我们回溯过去几代人口时。在之前的博客中,我们几乎只处理了随时间推移基因变化的“正向”模拟。 群体遗传学_tRNA做科研的博客-CSDN博客 然而&…

【漏洞复现】时空智友ERP——uploadStudioFile——任意文件上传

声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 时空智友ERP是专为医药等行业设计的综合性企业资源规划系统&…

【漏洞复现】锐捷校园网自助服务系统 任意文件读取

声明:本文档或演示材料仅用于教育和教学目的。如果任何个人或组织利用本文档中的信息进行非法活动,将与本文档的作者或发布者无关。 一、漏洞描述 锐捷校园网自助服务系统是用于学校网络管理的一个平台,login_judge.jsf接口存在任意文件读取…

现在国内的ddos攻击趋势怎么样?想了解现在ddos的情况该去哪看?

目前,国内的DDoS攻击趋势显示出以下几个特征: 攻击频次显著增加:根据《快快网络2024年DDoS攻击趋势白皮书》,2023年DDoS攻击活动有显著攀升,总攻击次数达到1246.61万次,比前一年增长了18.1%。 攻击强度和规…

Collection接口及遍历集合的方式Iterator接口、增强for循环的介绍和使用

Collection接口 概述:单列集合的顶级接口格式:其中泛型决定了集合中能存储什么类型的数据,可以统一元素类型,泛型中只能写引用数据类型,如果不写,默认Object类型。等号前面的泛型必须写,等号后…

增强现实(AR)与虚拟现实(VR)的区别?

随着科技的飞速发展,增强现实(AR)与虚拟现实(VR)技术在各个领域展现出巨大的潜力和应用前景。这两种技术虽然在体验和实现方式上有所不同,但都为用户提供了全新的感知体验。本文将详细解析AR和VR的概念、区…

MySQL 面试相关问题

1. MySQL 基础问题1.1 为什么用MySQL?1.2 表属性类型 varchar 和 char 的区别?1.2 什么时候用 varchar 和 char?1.3 Datetime 和 Timestamp 的区别?1.4 一个SQL语句的执行过程,表述下? 2. MySQL 存储引擎相…

凝思安全操作系统安装部署

原文链接:凝思安全操作系统安装部署 Hello,大家好啊!今天给大家带来一篇关于凝思安全操作系统安装部署的文章。凝思安全操作系统是一款注重安全和隐私保护的操作系统,适用于各种高安全性需求的场景。本文将详细介绍如何安装和部署…

万字学习——DCU编程实战

参考资料 2.1 DCU软件栈(DCU ToolKit, DTK) DCU 开发与使用文档 (hpccube.com) DCU软件栈 DCU的软件栈—DCU Toolkit(DTK) HIP(Heterogeneous-Compute Interface for Portability)是AMD公司在2016年提出…

【C++题解】1405 - 小丽找潜在的素数?

问题:1405 - 小丽找潜在的素数? 类型:进制转换 题目描述: 小丽同学在编程中学到了二进制数的概念,她发现,有些二进制数,如果转为 10 进制,就是素数,小丽把这些数称为潜…