证书学习(五)Java实现RSA、SM2证书颁发

embedded/2024/9/23 7:30:50/

目录

    • 一、知识回顾
      • 1.1 X.509 证书
      • 1.2 X509Certificate 类
    • 二、代码实现
      • 2.1 Maven 依赖
      • 2.2 RSA 证书颁发
        • 1)PfxGenerateUtil 证书文件生成工具类
        • 2)CertDTO 证书中间类
        • 3)RSACertGenerateTest RSA证书生成测试类
        • 4)执行结果
      • 2.3 SM2 证书颁发
        • 1)SM2Utils 国密SM2算法工具类
        • 2)SM2CertGenerateTest SM2证书生成测试类
        • 3)执行结果

一、知识回顾

1.1 X.509 证书

我们在之前的文章中介绍过,X.509证书 是一种遵循 X.509(RFC 5280) 的数字证书,是目前 世界上使用最广泛 的数字证书类型,用于验证网络通信中的实体身份。

1.2 X509Certificate 类

在 Java 中,X.509证书 通常使用 java.security.cert.X509Certificate 类表示。该类是 JCA(Java Cryptography Architecture) 的一部分,提供了一些 用于处理数字证书 的方法。

补充: JCA(Java Cryptography Architecture)是平台的重要组成部分,它包含了一个 provider 架构和一系列 API,用途如下所示:

  • 数字签名(digital signatures)、消息摘要(hashes)、证书(certificates )及其 验证( certificate validation)、加密(对称/非对称块/流密码)encryption (symmetric/asymmetric block/stream ciphers)、密钥生成与管理(key generation and management)以及 安全随机数生成(secure random number generation)等。

下面我们就来介绍一下如何用Java实现 RSA 证书的颁发。


二、代码实现

2.1 Maven 依赖

Java 实现证书颁发主要依赖于 Bouncy Castle 的 bcprov-jdk15onbcpkix-jdk15on 两个核心库。

这两个库分别用于不同的功能:

  1. bcprov-jdk15on:
    • 用途: 这个库包含了基本的密码学算法实现,如:对称加密算法(AES、DES等)、非对称加密算法(RSA、ECC)、哈希函数(SHA-256、SHA-512等)、消息摘要算法等。
    • 依赖: 基础库,不依赖于其他库。
  2. bcpkix-jdk15on:
    • 用途: 这个库提供了 X.509 证书和 CMS(Cyptographic Message Syntax)的支持,主要用于证书管理,包括证书的生成、验证、导入导出等操作;同时支持 CMS 格式的封装和解封装,用于加密和签名的消息。
    • 依赖: 依赖于 bcprov-jdk15on,因为证书处理和消息封装需要用到基本的密码学算法。
<!-- Bouncy Castle库 -->
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.70</version>
</dependency>
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcpkix-jdk15on</artifactId><version>1.70</version>
</dependency>

补充:

  • Bouncy Castle 官网: https://www.bouncycastle.org/download/bouncy-castle-java/

在这里插入图片描述


2.2 RSA 证书颁发

1)PfxGenerateUtil 证书文件生成工具类

PfxGenerateUtil.java

java">import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.bouncycastle.jce.X509Principal;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.x509.X509V3CertificateGenerator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;import javax.security.auth.x500.X500Principal;
import java.io.File;
import java.io.FileOutputStream;
import java.math.BigInteger;
import java.security.*;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.util.Date;
import java.util.Random;/*** .pfx/.p12 证书文件生成工具类*/
@Component
public class PfxGenerateUtil {private static final Logger LOGGER = LoggerFactory.getLogger(PfxGenerateUtil.class);private static final String KEY_STORE_TYPE = "PKCS12";private static final String ALGORITHM_TYPE = "RSA";private static final int KEY_SIZE = 2048;private static final String SIGNATURE_ALGORITHM = "SHA256withRSA";static {// 系统添加BC加密算法Security.addProvider(new BouncyCastleProvider());}/*** 创建个人证书*/public static X509Certificate createPersonPfx(String certPath, String password, String account) throws Exception {Date notBefore = new Date();Date notAfter = DateUtils.addYears(notBefore, 1);return createPfx(certPath, password, notBefore, notAfter, account, null);}/*** 创建企业证书*/public static X509Certificate createOrgPfx(String certPath, String password, String account, String orgCode) throws Exception {Date notBefore = new Date();Date notAfter = DateUtils.addYears(notBefore, 1);return createPfx(certPath, password, notBefore, notAfter, account, orgCode);}/*** 创建证书*/private static X509Certificate createPfx(String certPath, String password, Date notBefore, Date notAfter, String account, String orgCode) throws Exception {LOGGER.debug("The cert path is: " + certPath);//如果目录不存在创建目录File certFilePath = FileUtils.getFile(certPath);FileUtils.forceMkdir(certFilePath.getParentFile());// 设置颁发者和主题// CN (Common Name名字与姓氏)// OU (Organization Unit组织单位名称)// O(Organization组织名称)// L(Locality城市或区域名称)// ST(State州或省份名称)// C(Country国家名称)String issuerString;String subjectString;if(orgCode == null || "".equals(orgCode.trim())) {subjectString = "C=CN,CN=" + account;issuerString = "C=CN,CN=www.bo.cn CA Individual";} else {subjectString = "C=C,CN=" +

http://www.ppmy.cn/embedded/115476.html

相关文章

k8s的一些命令

kubectl get nodes &#xff1a;查看节点的状态 查看Pod的状态&#xff1a; kubectl get pod --all -namespacesPending,ContainerCreating,ImagePullBackOff都表明Pod没有就绪&#xff0c;Running才是就绪状态 查看Pod的具体情况&#xff1a; kubectl describe pod podnamek…

PDF转图片的思路思考

记录时间:2022年9月1日 PDF转图片库的使用和扩展 python有几个开源的免费的处理Pdf的库&#xff0c;甚至有的已经有很完善的功能了。我发挥一下自己的所学&#xff0c;看看能不能把它变为可用的一程序。 首先是了解PDF处理库PyMupdf&#xff0c;这个库得到路径之后普就可以对…

Vulkan 学习(8)---- vkImageView 创建

目录 OverView创建方法关键结构参考代码 OverView Vulkan 的图像视图(VkImageView) 用于描述如何访问 VkImage 对象以及访问图像的哪一部分, 图像视图定义了图像格式和访问方式&#xff0c;允许渲染管线和图像进行交互&#xff0c;无论是作为纹理&#xff0c;颜色附件或者深度…

Elastic 的 OpenTelemetry PHP 发行版简介

作者&#xff1a;Pawel Filipczak 宣布 OpenTelemetry PHP 的 Elastic 发行版的第一个 alpha 版本。在本篇博文中了解使用 OpenTelemetry 来检测 PHP 应用程序是多么简单。 我们很高兴推出 OpenTelemetry PHP 的 Elastic Distribution 的第一个 alpha 版本。在这篇文章中&…

洪涝洪水滑坡灾害数据集 灾害 2300张 带标注 voc yolo

洪涝洪水滑坡灾害数据集 灾害 2300张 带标注 voc yolo 洪涝洪水滑坡灾害数据集 数据集描述 该数据集是一个专门用于检测和识别洪涝、洪水和滑坡等自然灾害的数据集&#xff0c;旨在帮助研究人员和开发者训练和评估基于深度学习的目标检测模型。数据集涵盖了两种常见的自然灾害…

【AI创作组】Matlab绘图基础之plot函数

1. plot函数语法 1.1 基本语法 Matlab中的plot函数是最常用的绘图函数之一,其基本语法如下: plot(X,Y)X和Y可以是向量或矩阵,也可以是两个向量的元素个数相同的数组。当X和Y都是向量时,plot函数将在当前坐标轴上绘制Y对X的图。1.2 线型、颜色和标记 plot函数还允许用户…

c++----io流

提示&#xff1a;以下 是本篇文章正文内容&#xff0c;下面案例可供参考 1.标准io流 (1)数据的循环输入 对于内置类型&#xff1a;cin和cout直接使用&#xff0c;c已经重载了 (2)对于自定义类型&#xff1a; 需要我们自己对类型进行重载 2.文件io流 ifstream ifile(只输入…

【devops】devops-ansible之介绍和基础使用

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…