通过 Java 代码生成请求 CSR证书

概述

在 PKI(Public Key Infrastructure,公开密钥基础建设)体系中,证书签名请求(也称为 CSR 或证书请求)是由客户端提交给 CA(Certificate Authority)用于申请数字证书的信息。其中 PKCS#10 规范是 CSR 中最常见的格式。

比如,张三和李四通过互联网进行信息传输,他们两者都希望接受到的信息就是对方发送的原始内容,没有被任何篡改,且不能被抵赖。要实现这个目的,其中一个方法就是使用 PKI。在 PKI 中,他们双方都需要生成密钥对,即公钥和私钥。公钥顾名思义就是公开的密钥,大家都可以得到,而发送的信息则使用他们各自的私钥进行加密,相应的也只有他们各自的公钥才可以解密信息。

那么在实际中,我们是如何分享公钥呢?我们可以通过一个名为 CA(Certification Authority)的第三方机构实现公钥分享,其中还会涉及到 CA 的从属认证机构 RA(Registration Authority,注册管理中心)。CA 将用户的个人身份和公开密钥链接在一起;RA 则确保公开密钥和个人身份链接正确,防止抵赖。归根结底,CA 的作用就是对我们的公钥进行签名,而 CA 作为数字证书的权威机构,CA 的公钥证书一般都已经内置在了各类客户端软件中,所以客户端可以通过验证签发给我们证书的 CA 机构的合法性来判断我们这本证书的合法性。我们将公钥提交到 CA 的这一过程就叫 CSR。

Java生成CSR

  1. 使用标准加密算法获取KeyPairGenerator的实例,此处使用RSA。
  2. 通过提供密钥大小和随机性来源来初始化实例。
  3. 生成CSR中使用的PrivateKey和PublicKey。
  4. 使用PublicKey初始化PKCS10。
  5. 使用标准算法获取签名实例,此处使用MD5WithRSA。
  6. 使用PrivateKey初始化签名对象。
  7. 通过传递通用名称,组织单位,组织,位置,州和国家/地区来创建X500Name对象。
  8. 使用X500Signer,Signature和X500Name对象对PKCS10对象进行编码和签名。
  9. 将PKCS10对象打印到PrintStream。然后就可以使用了。

示例代码

首先,在项目中加入 BouncyCastly 库,以下是 Maven 依赖配置项:

<dependency><groupId>org.bouncycastle</groupId><artifactId>bcpkix-jdk18on</artifactId><version>1.72</version>
</dependency>

然后,下面是示例代码:

public class CsrUtils {private static final Provider BC = new BouncyCastleProvider();/*** 生成 PKCS#10 证书请求*/public static String generateCsr(boolean isRsaNotEcc) throws NoSuchAlgorithmException, InvalidAlgorithmParameterException, OperatorCreationException, IOException {// 使用 RSA/ECC 算法,生成密钥对(公钥、私钥)KeyPairGenerator generator = KeyPairGenerator.getInstance(isRsaNotEcc ? "RSA" : "EC", BC);if (isRsaNotEcc) {// RSAgenerator.initialize(2048);} else {// ECCgenerator.initialize(new ECGenParameterSpec("sm2p256v1"));}KeyPair keyPair = generator.generateKeyPair();PrivateKey privateKey = keyPair.getPrivate();PublicKey publicKey = keyPair.getPublic();//打印私钥,注意:请务必保存您的私钥printOpensslPemFormatKeyFileContent(privateKey, isRsaNotEcc);// 按需添加证书主题项,X500Principal subject = new X500Principal("C=CN");// 使用私钥和 SHA256WithRSA/SM3withSM2 算法创建签名者对象ContentSigner signer = new JcaContentSignerBuilder(isRsaNotEcc ? "SHA256WithRSA" : "SM3withSM2").setProvider(BC).build(privateKey);// 创建 CSRPKCS10CertificationRequestBuilder builder = new JcaPKCS10CertificationRequestBuilder(subject, publicKey);PKCS10CertificationRequest csr = builder.build(signer);// 打印 OpenSSL PEM 格式文件字符串printOpensslPemFormatCsrFileContent(csr);// 以 Base64 字符串形式返回 CSRreturn Base64.getEncoder().encodeToString(csr.getEncoded());}/*** 打印 OpenSSL PEM 格式文件字符串的 SSL证书密钥 KEY 文件内容* @param privateKey 私钥* @param isRsaNotEcc {@code true}:使用 RSA 加密算法;{@code false}:使用 ECC(SM2)加密算法*/private static void printOpensslPemFormatKeyFileContent(PrivateKey privateKey, boolean isRsaNotEcc) throws IOException {PemObject pem = new PemObject(isRsaNotEcc ? "PRIVATE KEY" : "EC PRIVATE KEY", privateKey.getEncoded());StringWriter str = new StringWriter();PemWriter pemWriter = new PemWriter(str);pemWriter.writeObject(pem);pemWriter.close();str.close();System.out.println(str.toString());}/*** 打印 OpenSSL PEM 格式文件字符串的 SSL 证书请求 CSR 文件内容* @param csr 证书请求对象*/private static void printOpensslPemFormatCsrFileContent(PKCS10CertificationRequest csr) throws IOException {PemObject pem = new PemObject("CERTIFICATE REQUEST", csr.getEncoded());StringWriter str = new StringWriter();PemWriter pemWriter = new PemWriter(str);pemWriter.writeObject(pem);pemWriter.close();str.close();System.out.println(str.toString());}
}

其他

除此之外,我们还可以使用Java密钥工具Java Keytool的-genkeypair命令来生成私钥和证书请求文件。

keytool -genkeypair -keyalg RSA -keysize 2048 -keystore keystore.jks -storepass password -validity 365 -alias myalias

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

目标追踪学习经验总结

标题目标追踪算法学习经验总结   最近对目标追踪算法进行了学习&#xff0c;以下是我的学习经验&#xff0c;如有不对之处&#xff0c;欢迎大家指正。 1、简介 1.1 定义 目标跟踪是通过分析视频图片序列&#xff0c;对检测出的各个候选目标区域实施匹配&#xff0c;定位出这…

【面试八股】IP协议八股

IP协议八股 子网掩码的作用为什么IP协议需要分片IP协议什么时候需要分片IP协议是怎么进行分片的那么IP协议是如果进行标识属于同一个分片呢&#xff1f;TCP协议和UDP协议将数据交给IP协议之后&#xff0c;是否需要分片传输&#xff1f; 子网掩码的作用 用来标识网络号和主机号…

029-从零搭建微服务-消息队列(一)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff08;后端&#xff09;&#xff1a;mingyue: &#x1f389; 基于 Spring Boot、Spring Cloud & Alibaba 的分布式微服务架构基础服务中心 源…

Java基础常考知识点(基础、集合、异常、JVM)

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有需要我的支持&#xff0c;请私信或评论留言&#xff01; Java基础常考知识点…

笔记本摄像头怎么打开?记牢这5个简单方法!

“我有一个紧急视频会议&#xff0c;但是关键时刻我的笔记本电脑摄像头居然打不开了&#xff0c;真的让我很崩溃。有什么方法可以快速解决这个问题吗&#xff1f;非常感谢&#xff01;” 在互联网时代&#xff0c;电脑对我们来说非常重要。而借助电脑摄像头与朋友交流或者与同事…

FFmpeg音视频复用器----为啥大多数视频只有一个视频流和一个音频流

问题&#xff1a;为啥大多数视频只有一个视频流和一个音频流&#xff1f; 回答&#xff1a; 大多数视频文件通常只包含一个视频流和一个音频流&#xff0c;这是因为这种组合足以满足一般的多媒体需求&#xff0c;并且减少了复杂性和文件大小。以下是一些解释为什么大多数视频文…

601-体育馆的人流量

文章目录 601-体育馆的人流量1. 题目2. 思路3. 解决4. 运行结果 601-体育馆的人流量 1. 题目 2. 思路 思路&#xff1a;查询Stadium表中人流量超过100的记录&#xff0c;将查询结果与自身的临时表连接&#xff0c;再使用where获得满足条件的记录 查询Stadium表中人流量超过10…

asp.net服装管理系统三层架构

asp.net服装管理系统三层架构说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql server数据库&#xff0c;并采用EF实体模型开发。 三层架构并采用EF实体模型开发 功能模块&#xff1a; 运行环境&#xff1…

CyclicBarrier 、CountDownLatch 、Semaphore 的用法

1 CountDownLatch&#xff08;线程计数器 &#xff09; CountDownLatch类位于java.util.concurrent 包下&#xff0c;利用它可以实现类似计数器的功能。比如有一个任务 A&#xff0c;它要等待其他 4 个任务执行完毕之后才能执行&#xff0c;此时就可以利用 CountDownLatch 来实…

第二证券:国庆档票房有望延续复苏态势 海风拐点已至

昨日&#xff0c;两市股指盘中强势轰动上扬&#xff0c;创业板指早盘一度涨近2%&#xff0c;随后涨幅逐渐收窄。到收盘&#xff0c;沪指涨0.16%报3107.32点&#xff0c;深成指涨0.44%报10104.32点&#xff0c;创业板指涨0.82%报2006.22点&#xff0c;两市算计成交7165亿元&…

iOS 视频压缩 mov转mp4 码率

最近还是因为IM模块的功能&#xff0c;IOS录制MOV视频发送后&#xff0c;安卓端无法播放&#xff0c;迫不得已兼容将MOV视频转为MP4发送。 其中mov视频包括4K/24FPS、4K/30FPS、4K/60FPS、720p HD/30FPS、1080p HD/30FPS、1080p HD/60FPS&#xff01; 使用AVAssetExportSessi…

排序学习总结

取每个对象的内接矩形框&#xff0c;然后再排序&#xff0c;根据排序的结果确定原对象顺序。 inner_rectangle1(RegionAffineTrans1, Row1, Column1, Row2, Column2) gen_rectangle1(Rect,Row1, Column1, Row2, Column2) sort_region(Rect,RectSort,character,true, row)count…

4k、VR与万兆光网

“全光万兆”对VR意义重大。 pico4的分辨率 PICO 4 的单眼分辨率是 2160 2160&#xff0c;整体分辨率高达 4320 2160。这是一款高性能的 VR 一体机&#xff0c;采用了 2.56 英寸的 Fast-LCD 屏幕&#xff0c;最高可实现 90Hz 刷新率&#xff0c;还有 1200 PPI 和 20.6 PPD 的…

一、2023.9.27.C++基础.1

回答问题一定要有逻辑性&#xff0c;我将从 这个技术是什么&#xff1f; 为什么要有这个技术&#xff1f; 这个技术底层是怎么实现的&#xff1f; 这个技术的优点缺点&#xff1f; 这个技术所适合的使用场景&#xff1f; 以下五个方面来回答问题。 文章目录 一、C基础部分&…

电信突然关闭2G信号,老人机不能打电话接短信了如何解决?

前两天家里老人手机突然没有任何信号&#x1f4f6;&#xff0c;发现只能通过4g上网&#xff0c;但是接打电话都不通&#xff0c;我以为手机坏了。电信也没通知&#xff0c;我打电话问1万号电信客服告知我电信网络升级了&#xff0c;手机支持高清通话功能才可以正常接打电话&…

行为型设计模式——责任链模式

摘要 责任链模式(Chain of responsibility pattern): 通过责任链模式, 你可以为某个请求创建一个对象链. 每个对象依序检查此请求并对其进行处理或者将它传给链中的下一个对象。 一、责任链模式意图 职责链模式&#xff08;Chain Of Responsibility&#xff09; 是一种行为设…

弱信号的采样与频谱分析(修订中...)

1.频谱混叠效应 - 波形数据抽样 这是一组经过抽样的数据的频谱&#xff0c;红圈圈出的两条谱线&#xff0c;是我们需要关注的特征谱线。这个信号与右侧的临近信号比较&#xff0c;求频率比值&#xff0c;比值恒定与理论推导相符。再5取1降低采样率后&#xff0c;大致相同的频率…

接口测试--Postman常用断言

Postman的断言是用javascript语言写的 引入--什么是断言 结果中的特定属性或值与预期做对比&#xff0c;如果一致&#xff0c;则用例通过&#xff0c;如果不一致&#xff0c;断言失败&#xff0c;用例失败。断言&#xff0c;是一个完整测试用例所不可或缺的一部分&#xff0c…

Linux系统上使用SQLite

1. 安装SQLite 在Linux上安装SQLite非常简单。可以使用包管理器&#xff08;如apt、yum&#xff09;直接从官方软件源安装SQLite。例如&#xff0c;在Ubuntu上使用以下命令安装SQLite&#xff1a; sudo apt-get install sqlite32. 打开或创建数据库 要打开或创建一个SQLite数…

5月22日比特币披萨日,今天你吃披萨了吗?

比特币披萨日 1. Laszlo Hanyecz2. 最贵披萨诞生记3. 梭哈买披萨4. 未完待续 2010年5月22日&#xff0c;美国佛罗里达州的程序员Laszlo Hanyecz&#xff08;拉兹洛哈涅克斯&#xff09;用10000个比特币购买了棒约翰&#xff08;Papa Johns&#xff09;比萨店一个价值25美元的奶…