java csr 证书_Java bouncycastle API 创建 CSR 和签发证书
引入 API
org.bouncycastle
bcprov-jdk15on
1.64
创建 CSR
CSR,即证书请求文件(Certificate Signing Request)。生成 X509 数字证书前,一般先由用户提交证书申请文件,然后由 CA 来签发证书。
// 创建密钥对
KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
gen.initialize(2048);
KeyPair pair = gen.generateKeyPair();
PrivateKey privateKey = pair.getPrivate();
PublicKey publicKey = pair.getPublic();
// 创建 CSR 对象
X500Principal subject = new X500Principal("C=CName, ST=STName, L=LName, O=OName, OU=OUName, CN=CNName, [email protected]");
ContentSigner signGen = new JcaContentSignerBuilder("SHA256withRSA").build(privateKey);
PKCS10CertificationRequestBuilder builder = new JcaPKCS10CertificationRequestBuilder(subject, publicKey);
// 添加 SAN 扩展
ExtensionsGenerator extensionsGenerator = new ExtensionsGenerator();
GeneralNames generalNames = new GeneralNames(new GeneralName[]{new GeneralName(GeneralName.rfc822Name, "ip=6.6.6.6"), new GeneralName(GeneralName.rfc822Name, )});
extensionsGenerator.addExtension(Extension.subjectAlternativeName, false, generalNames);
builder.addAttribute(PKCSObjectIdentifiers.pkcs_9_at_extensionRequest, extensionsGenerator.generate());
// build csr
PKCS10CertificationRequest csr = builder.build(signGen);
// 输出 PEM 格式的 CSR
OutputStreamWriter output = new OutputStreamWriter(System.out);
JcaPEMWriter pem = new JcaPEMWriter(output);
pem.writeObject(csr);
pem.close();
PEM 格式 CSR 示例如下:(PER 是对 DER 的简单包装)
-----BEGIN CERTIFICATE REQUEST-----
MIIC5DCCAcwCAQAwgZ4xIjAgBgkqhkiG9w0BCQEWE3NlbnRoYWRldkBnbWFpbC5j
b20xGjAYBgNVBAMTEXd3dy5zZW50aGFkZXYuY29tMRMwEQYDVQQLEwpJbm5vdmF0
aW9uMRIwEAYDVQQKEwlTZW50aGFkZXYxEjAQBgNVBAcTCVRyb25kaGVpbTESMBAG
A1UECBMJVHJvbmRoZWltMQswCQYDVQQGEwJOTzCCASIwDQYJKoZIhvcNAQEBBQAD
ggEPADCCAQoCggEBAMkKvsCUp52lcmM//iJEV62yHzDS/ASwm0wmlbUR+OnxESA5
vsYYzqdxX/Ie+K4LqY/FKsnHwcj+l7PqIHPqgiDryMcfYFpmln31jJG6XPFmjBib
m0kl63G9T62EyoRYo7SFZq/wcdgEE0FTw4bnTyT5OED2cYRlozBXdnI0L9jZYv6b
R6ww4LD4cAkqq1TeKNt0lH5G7S8QqTIeobs7hYUgVXkKWhfrYrW0l4lYUuXC12sN
e/zGYClHoaFoasD9pzoFrVjDS9+a3JoInp22OxpQbBVchnOJ3yJr8PRS5Hzx5QYJ
TAYqUd8dsw372FhvnNlZJnSkAsxca7cfpCiL4ZECAwEAAaAAMA0GCSqGSIb3DQEB
BQUAA4IBAQDDTj7ZJaeRftrod5TuEPoDhH8SwCx/wX8aIYG3mjR+q8tJ6rYgPwqR
Du8ODOAgIRFC8Dk43taPhbL94+T+iyw+UJH1KGlf0cdfHvaPoTh6QqfIQHRXuq5H
hkb9g+DgG/uzIS0yQsviKCTwFOZkvaWMZQSlBkAzFf61NQ9ymjLRFnzUN3IBmxMU
VBBEVVchta79XtkQaOsHWaZPpuwvDEtrvvwjk6kIEsc7IU927nN1Vws9oDFsqrKl
ycNVfwjd0cgf5WsTbPnBjQdVSSdAWvJo1wLrv3GxGVUwi44TzVU0xvREYAmZknCW
kpMkr5KBOO3Prex5d0doD5MJhMvxHcSL
-----END CERTIFICATE REQUEST-----
利用 CSR 创建证书
首先,读取、解析 CSR 文件:
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
// 解析 PEM 格式的 CSR
PKCS10CertificationRequest csr = null;
ByteArrayInputStream pemStream = new ByteArrayInputStream(pem.getBytes(Charsets.UTF_8));
Reader pemReader = new BufferedReader(new InputStreamReader(pemStream));
PEMParser pemParser = new PEMParser(pemReader);
Object parsedObj = pemParser.readObject();
System.out.println("PemParser returned: " + parsedObj);
if (parsedObj instanceof PKCS10CertificationRequest) {
csr = (PKCS10CertificationRequest) parsedObj;
}
利用 PKCS10CertificationRequest 枪法证书
KeyPair rootPair = KeyUtil.generateKeyPair("RSA", 4096);
// 私钥用来前面
PrivateKey issuePriveteKey = rootPair.getPrivate();
X509Certificate rootCert = // 利用公钥创建根证书,来签发用户证书
X509v3CertificateBuilder certificateBuilder = new X509v3CertificateBuilder(
new X500Name(rootCert.getSubjectDN().getName()),
BigInteger.valueOf(666666666L),
new Date(),
new Date(System.currentTimeMillis() + 1000 * 86400 * 365L),
pkcs10CertificationRequest.getSubject(),
pkcs10CertificationRequest.getSubjectPublicKeyInfo()
);
// 读取扩展信息
Extensions extensions = null;
for (Attribute attr : pkcs10CertificationRequest.getAttributes()) {
if (PKCSObjectIdentifiers.pkcs_9_at_extensionRequest.equals(attr.getAttrType())) {
extensions = Extensions.getInstance(attr.getAttributeValues()[0]);
break;
}
}
if (extensions != null) {
// 添加 SAN 扩展
certificateBuilder.addExtension(extensions.getExtension(Extension.subjectAlternativeName));
}
//添加crl扩展
GeneralName[] names = new GeneralName[1];
names[0] = new GeneralName(GeneralName.uniformResourceIdentifier, "http://www.ca.com/crl");
GeneralNames gns = new GeneralNames(names);
DistributionPointName pointName = new DistributionPointName(gns);
GeneralNames crlIssuer = new GeneralNames(new GeneralName(new X500Name(rootCert.getSubjectDN().getName())));
DistributionPoint[] points = new DistributionPoint[1];
points[0] = new DistributionPoint(pointName, null, crlIssuer);
certificateBuilder.addExtension(Extension.cRLDistributionPoints, false, new CRLDistPoint(points));
//添加aia扩展
AccessDescription[] accessDescriptions = new AccessDescription[2];
accessDescriptions[0] = new AccessDescription(AccessDescription.id_ad_caIssuers, new GeneralName(GeneralName.uniformResourceIdentifier, "http://www.ca.com/root.crt"));
accessDescriptions[1] = new AccessDescription(AccessDescription.id_ad_ocsp, new GeneralName(GeneralName.uniformResourceIdentifier, "http://ocsp.com/"));
certificateBuilder.addExtension(Extension.authorityInfoAccess, false, new AuthorityInformationAccess(accessDescriptions));
ContentSigner signer = new JcaContentSignerBuilder(HostCertificateConf.CERTIFICATE_SIGNATURE_ALGORITHM)
.setProvider(Security.getProvider("BC")).build(issuePriveteKey);
X509CertificateHolder holder = certificateBuilder.build(signer);
X509Certificate cert = new JcaX509CertificateConverter()
.setProvider(Security.getProvider( "BC")).getCertificate(holder);
java csr 证书_Java bouncycastle API 创建 CSR 和签发证书相关推荐
- Java bouncycastle API 创建 CSR 和签发证书
引入 API <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk ...
- java ssl证书_Java安全教程–创建SSL连接和证书的分步指南
java ssl证书 在有关应用JEE安全性的系列文章中,我们为您提供了另一个有关如何在Java EE应用程序中创建SSL连接和创建证书的详细教程. 如我们之前的文章中所述, 安全套接字层(SSL)/ ...
- 加密解密概述及openssl应用及其创建CA和签发证书的实现
数据非常重要,这是大家的共识,为了保证数据的安全,就会涉及到加密及其解密,本文主要介绍加密 解密相关概念及其在Linux平台下加密解密的具体实现openssl基础,及openssl创建CA和签发证书: ...
- SSL数字证书(二)使用makecert.exe签发证书
数字证书原理(〇)认识SSL SSL数字证书(一)CA.根证书与数字证书 SSL数字证书(二)使用makecert.exe签发证书 SSL数字证书(三)使用 openssl 生成证书 首先放出几个参考 ...
- openssl创建CA并签发证书
一.创建私有CA根证书 1.创建CA目录 root@DESKTOP-JP3S3AN:/home/wsl/openssl_pro# mkdir -pv /etc/pki/CA/{private,cert ...
- java初始化实例化_Java对象的创建过程:类的初始化与实例化
一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...
- java ssl 无证书_java – 如何修复SSL – 没有可用的证书
我想使用以下代码建立服务器SSL套接字连接: int port = 12000; ServerSocketFactory ssocketFactory = SSLServerSocketFactory ...
- java sound 数据处理_Java Sound API:捕获目标端口的声音输出
我正在编写一个简单的软件,通过LAN传输音频.我已经实现了所有网络部分,但我磕磕绊绊的是使用 Java Sound API.我已成功捕获麦克风的音频和线路输入,但我似乎无法从任何目标端口捕获,如扬声器 ...
- java map增加值_Java程序以创建HashMap并添加键值对
要创建HashMap,请使用HashMap类-HashMap hm = new HashMap(); 以键值对形式将元素添加到HashMap-hm.put("Bag", new I ...
最新文章
- Lines色线halcon算子,持续更新
- javaslang_使用Javaslang的Java 8中的功能数据结构
- iosid不足以修改问题_寻找合作伙伴的技巧足以与您合作
- 最全的测试工具以及测试需要掌握的工具
- 百度360搜狗神马今日头条抖音获客方法解析|昔年优化推广
- vivado global和out-of-context 选项
- 【codeVS 1082】树状数组(区间修改,区间查询)模版题
- xftp地址栏消失解决办法
- PDF Candy Desktop(全能PDF工具箱)官方中文版V2.91 | pdf candy desktop官网下载 | 含pdf candy desktop使用教程
- 推荐几个高质量的软件测试实战项目
- C语言 case语句 连续值,对一个switch case语句使用两个值
- Nexmoe 博客主题的设计理念
- 正大期货市场基础知识
- 配饰 女生的第二件衣服
- JS进阶学习之ES5-ES6
- java jdbc 批量更新_java – JDBC PreparedStatement,批量更新和生成的密钥
- 定时循环发送UDP消息(例如:控制远程电脑的开机、关机、重启、打开和关闭程序等)—— 定时执行专家
- 入职4个月后,对于web开发的心得
- R5S RK3568运行安卓12搭配即插即用免驱免拨号的4G LTE模组测速演示
- 众安在线2019年净亏损4.5亿,消金保费收入降12%,赔付率升至97%