从PFX文件中获取私钥、公钥证书、公钥

2023-11-05

https://blog.csdn.net/ZuoYanYouYan/article/details/77868584

 

该类具体功能:根据pfx证书得到私钥、根据私钥字节数组获取私钥对象、根据公钥字节数组获取公钥、根据pfx证书获取证书对象,根据私钥、公钥证书、密码生成pkcs12,根据私钥、公钥证书、密钥,合成为pfx文件,依赖工具包:commons-io

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.FileUtils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File; import java.security.KeyFactory; import java.security.KeyStore; import java.security.PrivateKey; import java.security.PublicKey; import java.security.cert.Certificate; import java.security.cert.X509Certificate; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Enumeration; /** * Created by ssl on 2017/9/5. */ public class PFXUtil { /** * 获取RSA算法的keyFactory * * @return */ private static KeyFactory getKeyFactory() throws Exception { return getKeyFactory("RSA"); } /** * 获取指定算法的keyFactory * * @param algorithm * @return */ private static KeyFactory getKeyFactory(String algorithm) throws Exception { KeyFactory keyFactory = KeyFactory.getInstance(algorithm); return keyFactory; } /** * 根据pfx证书获取keyStore * * @param pfxData * @param password * @return * @throws Exception */ private static KeyStore getKeyStore(byte[] pfxData, String password) throws Exception { KeyStore keystore = KeyStore.getInstance("PKCS12"); keystore.load(new ByteArrayInputStream(pfxData), password.toCharArray()); return keystore; } /** * 根据pfx证书得到私钥 * * @param pfxData * @param password * @throws Exception */ public static PrivateKey getPrivateKeyByPfx(byte[] pfxData, String password) throws Exception { PrivateKey privateKey = null; KeyStore keystore = getKeyStore(pfxData, password); Enumeration<String> enums = keystore.aliases(); String keyAlias = ""; while (enums.hasMoreElements()) { keyAlias = enums.nextElement(); if (keystore.isKeyEntry(keyAlias)) { privateKey = (PrivateKey) keystore.getKey(keyAlias, password.toCharArray()); } } return privateKey; } /** * 根据pfx证书得到私钥 * * @param pfxPath * @param password * @return * @throws Exception */ public static PrivateKey getPrivateKeyByPfx(String pfxPath, String password) throws Exception { File pfxFile = new File(pfxPath); return getPrivateKeyByPfx(FileUtils.readFileToByteArray(pfxFile), password); } /** * 根据私钥字节数组获取私钥对象 * * @param privateKeyByte * @return * @throws Exception */ public static PrivateKey getPrivateKey(byte[] privateKeyByte) throws Exception { PrivateKey privateKey = null; PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyByte); KeyFactory keyFactory = getKeyFactory(); privateKey = keyFactory.generatePrivate(keySpec); return privateKey; } /** * 根据私钥Base64字符串获取私钥对象 * * @param privateKeyStr * @return * @throws Exception */ public static PrivateKey getPrivateKey(String privateKeyStr) throws Exception { byte[] privateKeyByte = Base64.decodeBase64(privateKeyStr); return getPrivateKey(privateKeyByte); } /** * 根据公钥字节数组获取公钥 * * @param publicKeyByte 公钥字节数组 * @return * @throws Exception */ public static PublicKey getPublicKey(byte[] publicKeyByte) throws Exception { PublicKey publicKey = null; X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyByte); KeyFactory keyFactory = getKeyFactory(); publicKey = keyFactory.generatePublic(keySpec); return publicKey; } /** * 根据公钥base64字符串获取公钥 * * @param publicKeyStr Base64编码后的公钥字节数组 * @return * @throws Exception */ public static PublicKey getPublicKey(String publicKeyStr) throws Exception { byte[] publicKeyByte = Base64.decodeBase64(publicKeyStr); return getPublicKey(publicKeyByte); } /** * 根据pfx证书获取证书对象 * * @param pfxData pfx的字节数组 * @param password pfx证书密码 * @return * @throws Exception */ public static X509Certificate getX509Certificate(byte[] pfxData, String password) throws Exception { X509Certificate x509Certificate = null; KeyStore keystore = getKeyStore(pfxData, password); Enumeration<String> enums = keystore.aliases(); String keyAlias = ""; while (enums.hasMoreElements()) { keyAlias = enums.nextElement(); if (keystore.isKeyEntry(keyAlias)) { x509Certificate = (X509Certificate) keystore.getCertificate(keyAlias); } } return x509Certificate; } /** * 根据pfx证书获取证书对象 * * @param pfxPath pfx证书路径 * @param password pfx证书密码 * @return * @throws Exception */ public static X509Certificate getX509Certificate(String pfxPath, String password) throws Exception { File pfxFile = new File(pfxPath); return getX509Certificate(FileUtils.readFileToByteArray(pfxFile), password); } //生成pkcs12 /** * 根据私钥、公钥证书、密码生成pkcs12 * * @param privateKey 私钥 * @param x509Certificate 公钥证书 * @param password 需要设置的密钥 * @return * @throws Exception */ public static byte[] generatorPkcx12(PrivateKey privateKey, X509Certificate x509Certificate, String password) throws Exception { Certificate[] chain = {x509Certificate}; KeyStore keystore = KeyStore.getInstance("PKCS12"); keystore.load(null, password.toCharArray()); keystore.setKeyEntry(x509Certificate.getSerialNumber().toString(), privateKey, password.toCharArray(), chain); ByteArrayOutputStream bytesos = new ByteArrayOutputStream(); keystore.store(bytesos, password.toCharArray()); byte[] bytes = bytesos.toByteArray(); return bytes; } //合成pfx /** * 根据私钥、公钥证书、密钥,保存为pfx文件 * * @param privateKey 私钥 * @param x509Certificate 公钥证书 * @param password 打开pfx的密钥 * @param saveFile 保存的文件 * @return * @throws Exception */ public static String generatorPFX(PrivateKey privateKey, X509Certificate x509Certificate, String password, File saveFile) throws Exception { //判断文件是否存在 if (!saveFile.exists()) { //判断文件的目录是否存在 if (!saveFile.getParentFile().exists()) { saveFile.getParentFile().mkdirs(); } saveFile.createNewFile(); } byte[] pkcs12Byte = generatorPkcx12(privateKey, x509Certificate, password); FileUtils.writeByteArrayToFile(saveFile, pkcs12Byte); return saveFile.getPath(); } public static void main(String[] args) throws Exception { String pfxPath = "C:\\Users\\49383\\Desktop\\文件\\国新测试证书-1.pfx"; String password = "1"; //私钥:pfx文件中获取私钥对象 PrivateKey privateKey = getPrivateKeyByPfx(pfxPath, password); byte[] privateKeyByte = privateKey.getEncoded(); String privateKeyStr = Base64.encodeBase64String(privateKeyByte); System.out.println("私钥Base64字符串:" + privateKeyStr); //=====私钥Base64字符串转私钥对象 PrivateKey privateKey2 = getPrivateKey(privateKeyStr); System.out.println("私钥Base64字符串2:" + Base64.encodeBase64String(privateKey2.getEncoded())); //证书:从pfx文件中获取证书对象 X509Certificate certificate = getX509Certificate(pfxPath, password); System.out.println("证书主题:" + certificate.getSubjectDN().getName()); String publicKeyStr = Base64.encodeBase64String(certificate.getPublicKey().getEncoded()); System.out.println("公钥Base64字符串:" + publicKeyStr); //=====根据公钥Base64字符串获取公钥对象 System.out.println("公钥Base64字符串2:" + Base64.encodeBase64String(getPublicKey(publicKeyStr).getEncoded())); //PFX:合成pfx(需要私钥、公钥证书) String savePath = generatorPFX(privateKey, certificate, "1", new File ("C:\\Users\\49383\\Desktop\\文件\\009\\009.pfx")); System.out.println(savePath); } }

转载于:https://www.cnblogs.com/kungfupanda/p/9012170.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从PFX文件中获取私钥、公钥证书、公钥 的相关文章

  • 如何克服原语按值传递的事实

    我有一段很长的代码来计算两个值 doubles 对我来说 我在几个地方使用了这段代码 为了坚持 DRY 原则 我应该将这段代码重构为一个很好的单元测试方法 但是我不能让它返回两个双精度数 而双精度数是原始的 因此不能按值传递和操作 我能想到
  • Eclipse 在源代码管理中保存操作

    我们希望找到一种在签入之前执行代码标准的 轻量级 方法 我们真的很喜欢使用 Eclipse 内置的想法保存操作 go to Preferences gt gt Java gt gt Editor gt gt Save Actions 其中有
  • 在文本文件中写入多行(java)

    下面的代码是运行命令cmd并使用命令行的输出生成一个文本文件 下面的代码在 Eclipse 的输出窗口中显示了正确的信息 但在文本文件中只打印了最后一行 谁能帮我这个 import java io public class TextFile
  • 如何创建一个显示 Spinners 的 x 和 y 值的表格?

    我想创建一个位于图表右侧的表格 其中显示 2 列 x 和 y 值已输入到xSpin and ySpin旋转器 我已经画了一张我想要桌子放置的位置的图 我尝试过在网格窗格布局中使用文本框来创建表格并将值直接输入到文本框网格中 但是我无法将它们
  • Java:如何从转义的 URL 获取文件?

    我收到了一个定位本地文件的 URL 事实上我收到的 URL 不在我的控制范围内 URL 按照 RFC2396 中的定义进行有效转义 如何将其转换为 Java File 对象 有趣的是 URL getFile 方法返回一个字符串 而不是文件
  • 正则表达式拆分数字和字母组,不带空格

    如果我有一个像 11E12C108N 这样的字符串 它是字母组和数字组的串联 如何在中间没有分隔符空格字符的情况下分割它们 例如 我希望分割结果为 tokens 0 11 tokens 1 E tokens 2 12 tokens 3 C
  • 如何使用 Java 处理 Selenium WebDriver 中的新窗口?

    这是我的代码 driver findElement By id ImageButton5 click Thread sleep 3000 String winHandleBefore driver getWindowHandle drive
  • wait() 在游戏中如何工作?

    在 playframework 的文档中here http www playframework org documentation 1 2 1 asynchronous已写 public static void loopWithoutBlo
  • 如何在不超过最大值的情况下增加变量?

    我正在为学校开发一个简单的视频游戏程序 我创建了一个方法 如果调用该方法 玩家将获得 15 点生命值 我必须将生命值保持在最大值 100 并且由于我目前的编程能力有限 我正在做这样的事情 public void getHealed if h
  • 当从服务类中调用时,Spring @Transactional 不适用于带注释的方法

    在下面的代码中 当方法内部 是从内部调用的方法外部 应该在交易范围内 但事实并非如此 但当方法内部 直接从调用我的控制器class 它受到事务的约束 有什么解释吗 这是控制器类 Controller public class MyContr
  • 如何安全地解决这个 Java 上下文类加载器问题?

    我的数百名用户中只有一位在启动我的 Java 桌面应用程序时遇到问题 他只有大约三分之一的时间开始 另外三分之二的时间在启动时抛出 NullPointerException Exception in thread AWT EventQueu
  • 我需要什么库才能在 Java 中访问这个 com.sun.image.codec.jpeg?

    我正在用java创建一个图像水印程序 并导入了以下内容 import com sun image codec jpeg JPEGCodec import com sun image codec jpeg JPEGEncodeParam im
  • 画透明圆,外面填充

    我有一个地图视图 我想在其上画一个圆圈以聚焦于给定区域 但我希望圆圈倒转 也就是说 圆的内部不是被填充 而是透明的 其他所有部分都被填充 请参阅这张图片了解我的意思 http i imgur com zxIMZ png 上半部分显示了我可以
  • Calendar.getInstance(TimeZone.getTimeZone("UTC")) 不返回 UTC 时间

    我对得到的结果真的很困惑Calendar getInstance TimeZone getTimeZone UTC 方法调用 它返回 IST 时间 这是我使用的代码 Calendar cal Two Calendar getInstance
  • 在游戏视图下添加 admob

    我一直试图将 admob 放在我的游戏视图下 这是我的代码 public class HoodStarGame extends AndroidApplication Override public void onCreate Bundle
  • 如何在 Java 中测试一个类是否正确实现了 Serialized(不仅仅是 Serialized 的实例)

    我正在实现一个可序列化的类 因此它是一个与 RMI 一起使用的值对象 但我需要测试一下 有没有办法轻松做到这一点 澄清 我正在实现该类 因此在类定义中添加 Serialized 很简单 我需要手动序列化 反序列化它以查看它是否有效 我找到了
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • ServletContainer 类未找到异常

    我无法再编译我的球衣项目 并且出现以下异常 GRAVE Servlet Project API threw load exception java lang ClassNotFoundException com sun jersey spi
  • 调整添加的绘制组件的大小和奇怪的摆动行为

    这个问题困扰了我好几天 我正在制作一个特殊的绘画程序 我制作了一个 JPanel 并添加了使用 Paint 方法绘制的自定义 jComponent 问题是 每当我调整窗口大小时 所有添加的组件都会 消失 或者只是不绘制 因此我最终会得到一个
  • 如何在 JFreeChart 中设置多个系列的线条粗细?

    我创建了很多图表 在他们每个人中我都需要打电话 renderer setSeriesStroke i new BasicStroke 2 0f 对于每个系列 renderer is chart getXYPlot getRenderer 我

随机推荐

  • abapdata定义方法_ABAP中types与data,type与like的区别

    1 types与data区别 types是用来自定义某种类型的 需要data实例化才能使用 data是用来声明基本类型数据对象 也就是实例变量 对于用data直接定义的结构体对象 不参照其它结构类型 参照自定义类型生成新数据语法格式 TYP
  • 快速记忆电阻器色环值

    快速记忆电阻器色环值 觉得有用麻烦点个赞哦 开始正文 最近准备电设 看到电阻器11种色环 实在难记 因此花了我整整5 分钟 想出了一个快速记忆的方法 直接上图 上图是标准色环和阻值对应表 下面是我的简记方法 1 谐音组词记忆yyds 2 简
  • Mysql 主从复制

    简述 start slave show slave status G stop slave reset slave delete relay log create relay log reset master delete bin log
  • langchain包下载安装以及基本使用的注意事项

    当我们使用import langchain导入包是需要先下载langchain这个包 注意事项 我们的python版本必须大于等于3 8 1 否者将会导致 cannot import name RecursiveCharacterTextS
  • python三维点云投影(一)

    本文为博主原创文章 未经博主允许不得转载 本文为专栏 python三维点云从基础到深度学习 系列文章 地址为 https blog csdn net suiyingy article details 124017716 一 立体几何基础知识
  • MySQL的多表查询

    目录 多表关系 一对多 多对多 一对一 多表查询概述 分类 显示内连接 外连接 左外连接 右外连接 自连接 联合查询 子查询 分类 标量子查询 列子查询 行子查询 表子查询 多表关系 项目开发中 在进行数据库表结构设计时 会根据业务需求及业
  • 链表介绍

    链表介绍 链表与顺序表一样 也属于线性表 一个线性表是某类数据元素的一个集合 表里同时记录着元素之间的顺序关系 线性表的数据之间有顺序关系 顺序关系分为两种 一种是物理有序 即数据物理存储的位置顺序与数据之间的顺序关系一致 另一种是逻辑有序
  • VS Stuidio 2019实用调试技巧

    VS Studio 2019实用调试技巧 1 debug和release的区别 2 调试 1 调试最常使用的几个快捷键 2 用监视窗口查看临时变量的值 3 查看内存信息 4 查看调用堆栈 5 查看汇编信息 6 查看寄存器信息 3 如何写出易
  • 总结Python设置Excel单元格样式的一切,比官方文档还详细

    总结Python设置Excel单元格样式的一切 比官方文档还详细 Python对Excel表格处理非常方便 本文专门对Excel单元格样式设置进行总结 日常用到的设置基本都可以用openpyxl库完成 创建一个表格 openpyxl是第三方
  • 多项式轨迹--五次多项式轨迹

    转自 https blog csdn net libing403 article details 78715418 多项式轨迹 五次多项式轨迹 1 5 Polynomial of degree five 利用三次多项式 根据过q0 q1 q
  • 祝:天下码农中秋节快乐

    祝 天下码农中秋节快乐
  • 13.2 C语言风格的for命令、while命令和until命令

    C语言风格的for命令 在C语言中 for循环通常定义ige变量 然后这个变量会在每次迭代时自动改变 c语言的for命令 C语言的for命令有一个用来指明变量的特定方法 一个必须保持成立才能继续迭代的条件 以及另一个在每个迭代中改变变量的方
  • 算法设计与分析 动态规划 习题

    3 1 满足递归式F n F n 1 F n 2 和初始值F 0 F 1 1的数列称为斐波那契数列 考虑如何计算该数列的第n项F n 1 说明根据递归式直接完成计算 将有子问题重复求解 2 说明该问题具有优化子结构 3 写出求解F n 的动
  • 用matlab表白,你有一颗爱她的心,你就画出来

    恋爱过恋爱过程中 女生往往需要许多小惊喜 下面我教大家一种用matlab表白的一小段程序 画出一个火热的心 loving heart x y z x 2 9 4 y 2 z 2 1 3 3 x 2 z 3 9 80 y 2 z 3 爱心三维
  • Git 两分钟指南

    原文 http www garyrobinson net 2014 10 git in two minutes for a solo developer html作者 Gary Robinson 译文 http blog jobbole c
  • LeetCode【102】二叉树的层次遍历

    题目 给定一个二叉树 返回其按层次遍历的节点值 即逐层地 从左到右访问所有节点 例如 给定二叉树 3 9 20 null null 15 7 3 9 20 15 7 返回其层次遍历结果 3 9 20 15 7 通过观察返回的结果 可以直到是
  • ctfshow 每周大挑战 RCE极限挑战3

    目录 题目源码 1 跑一下正则 2 分析解题用什么payload 3 构造payload 如何获取字母N 构造出 POST及其他拼接内容 POST传参 4 完整解题payload 题目源码 1 跑一下正则 chr i echo chr i
  • 居中

    水平居中 1 HTML div class test img src images mlbtag jpg alt class test2 div CSS test width 100 test2 margin 0 auto display
  • Maximum Diameter Graph 【CodeForces - 1082D】【搜索+构造】

    题目链接 一开始忘记输出有多少条边 WA了好几发都跑不过第一组测试样例 开始怀疑自己是不是读了道假题 然后在大佬们的帮助下 终于AC 好伤心 读假样例 一定是我太弱了 我的思想是采用了树链剖分的dfs 构造思想 可能是因为最近少用了树链剖分
  • 从PFX文件中获取私钥、公钥证书、公钥

    https blog csdn net ZuoYanYouYan article details 77868584 该类具体功能 根据pfx证书得到私钥 根据私钥字节数组获取私钥对象 根据公钥字节数组获取公钥 根据pfx证书获取证书对象 根