首页 > 编程语言 >Java 从P12文件中提取公钥、私钥,并导出为DER、PEM和CERT格式的证书

Java 从P12文件中提取公钥、私钥,并导出为DER、PEM和CERT格式的证书

时间:2024-08-01 18:54:18浏览次数:17  
标签:公钥 私钥 certificate java DER ----- import 格式

import java.io.*;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.cert.Certificate;
import java.util.Enumeration;
import java.util.Base64;

public class P12ToKeysAndCerts {
    public static void main(String[] args) throws Exception {
        String p12FilePath = "p12_file.p12"; // P12文件路径
        String password = "p12_password"; // P12文件密码

        // 加载P12文件
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        try (FileInputStream fis = new FileInputStream(p12FilePath)) {
            keyStore.load(fis, password.toCharArray());
        }

        // 获取别名
        Enumeration<String> aliases = keyStore.aliases();
        String alias = null;
        if (aliases.hasMoreElements()) {
            alias = aliases.nextElement();
        }

        // 提取私钥和公钥
        PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, password.toCharArray());
        PublicKey publicKey = keyStore.getCertificate(alias).getPublicKey();

        // 提取证书并导出为DER格式
        Certificate certificate = keyStore.getCertificate(alias);
        try (FileOutputStream derFos = new FileOutputStream("output_certificate.der")) {
            derFos.write(certificate.getEncoded());
        }

        // 导出证书为PEM格式
        String pemCertificate = "-----BEGIN CERTIFICATE-----\n" +
                Base64.getEncoder().encodeToString(certificate.getEncoded()) +
                "\n-----END CERTIFICATE-----\n";
        try (FileWriter pemFw = new FileWriter("output_certificate.pem")) {
            pemFw.write(pemCertificate);
        }

        // CERT格式通常与DER相同,只是文件扩展名不同
        try (FileOutputStream certFos = new FileOutputStream("output_certificate.cert")) {
            certFos.write(certificate.getEncoded());
        }

        System.out.println("私钥: " + privateKey);
        System.out.println("公钥: " + publicKey);
        System.out.println("DER格式证书已导出到: output_certificate.der");
        System.out.println("PEM格式证书已导出到: output_certificate.pem");
        System.out.println("CERT格式证书已导出到: output_certificate.cert");
    }
}


-  CERT格式通常与DER格式相同,只是文件扩展名不同。有些可能将 .cer 或 .crt 用作证书文件的扩展名,但内容是相同的DER编码的二进制数据。
-  PEM格式是一个基于文本的格式,以"-----BEGIN CERTIFICATE-----"开头,并以"-----END CERTIFICATE-----"结尾,内容是Base64编码的DER数据。

标签:公钥,私钥,certificate,java,DER,-----,import,格式
From: https://blog.csdn.net/promise524/article/details/140854794

相关文章

  • Atcoder ABC298 D-F
    AtcoderABC298D-FD-WritingaNumeral链接:D-WritingaNumeral(atcoder.jp)简要题意:问题陈述我们有一个字符串\(S\)。初始值为\(S=\)1.按以下格式依次处理\(Q\)查询。1x:在\(S\)的末尾添加一个数字\(x\)。2:删除\(S\)开头的数字。3:以十进制形......
  • 每日一题——A - Max/Min AtCoder - abc356_e
    1.题目大意:枚举两个数的Max/Min向下取整之和。2.思路:一开始并没有想时间复杂度问题发现通过sort()排序来遍历每个最小值Min和后面最大值的和就是题目答案。你会发现仍然有问题,那就是取整的问题你就必须要优化然后发现很明显超时了。现在我们来换一个角度思考。搭配前缀和嘛。为......
  • vue3 自定义渲染,渲染函数实现,配置渲染render函数,低代码配置自定义渲染函数核心实现
    代码父组件<template><divclass="component-name"><!--全局自动的icon--><Extend:render="render"/></div></template><scriptsetuplang="ts">import{ref,reac......
  • MySQL5.7derived table &MySQL8.0derived_condition_pushdown
    随着MySQL版本的发展,优化器是越来越智能,优化器开关也越来越多,本文给大家分享一下MySQL对derivedtable的优化处理。何为derivedtable?这里我把它翻译成派生表,简单来讲,就是将from子句中出现的检索结果集当做一张表,比如from一个select构造的子查询,这个子查询就是一个派生表,from......
  • MySQL优化器derived_merge
    衍生表的优化:合并|具化一、mysql优化器对于衍生表的优化处理可以从两方面进行:将衍生表合并到外部查询将衍生表具化为内部临时表1、示例1:SELECT * FROM (SELECT * FROMt1) ASderived_t1;衍生表 derived_t1合并处理后,实际执行的查询类似如下:SELECT......
  • 【JLINK】J-link Commander
     官方参考文档:J-LinkCommander-SEGGERWiki一、运行    打开windows命令行窗口,找到有jlink.exe文件的地方,直接输入jlink.exe即可运行二、常用命令输入命令时候,大小写不影响Command(long)Command(short)ExplanationExampleBasic??Showinformationabouta......
  • 使用这个Blender工具非破坏性地自动化切割面板线
    "PanelCutter"插件自动化了在Blender中沿选定边缘创建程序化面板线的过程,使其成为硬表面建模的必备工具。这是一个设计用来非破坏性地自动化切割程序化面板线的小工具。这个工具对于硬表面模型,如汽车、船只和飞机来说,是救星。现在你可以动态地分配面板切割,而无需将其建模到拓扑......
  • Atcoder ABC297 E-G
    AtcoderABC297E-GE-KthTakoyakiSet链接:E-KthTakoyakiSet简要题意:问题陈述有\(N\)种章鱼烧出售。一个\(i\)-种的章鱼烧售价为\(A_i\)日元。高桥总共至少会买一个章鱼烧。他可以购买多个同类章鱼烧。求高桥可能支付的\(K\)个最低价格。在这里,如果有多......
  • HBuilderX 开发中使用 Node.js 搭建PDA扫码程序的服务端过程
    以下是使用HBuilderX和Node.js搭建程序服务端的大致步骤: 1. 安装Node.js首先,从Node.js官方网站下载并安装适合您操作系统的版本。在命令提示符中执行node-v,npm-v,检查nodejs版本是否安装完成。配置环境变量。2. 安装Oracle客户端根据您的操作系统,下载并安......
  • Solution - Atcoder AGC052B Tree Edges XOR
    令\(w_{(u,v)}\)为边\((u,v)\)的边权。考虑到对于一条边进行操作影响的是有公共点的边,于是一个想法是把边权转到点权,用点权来表示边权。于是考虑对于每个点构造\(w_u\)使得\(w_{(u,v)}=w_u\oplusw_v\)。因为这是一颗树,所以一定存在合法的构造。其实到了这里,这种......