引入 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 和签发证书相关推荐

  1. Java bouncycastle API 创建 CSR 和签发证书

    引入 API <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk ...

  2. java ssl证书_Java安全教程–创建SSL连接和证书的分步指南

    java ssl证书 在有关应用JEE安全性的系列文章中,我们为您提供了另一个有关如何在Java EE应用程序中创建SSL连接和创建证书的详细教程. 如我们之前的文章中所述, 安全套接字层(SSL)/ ...

  3. 加密解密概述及openssl应用及其创建CA和签发证书的实现

    数据非常重要,这是大家的共识,为了保证数据的安全,就会涉及到加密及其解密,本文主要介绍加密 解密相关概念及其在Linux平台下加密解密的具体实现openssl基础,及openssl创建CA和签发证书: ...

  4. SSL数字证书(二)使用makecert.exe签发证书

    数字证书原理(〇)认识SSL SSL数字证书(一)CA.根证书与数字证书 SSL数字证书(二)使用makecert.exe签发证书 SSL数字证书(三)使用 openssl 生成证书 首先放出几个参考 ...

  5. openssl创建CA并签发证书

    一.创建私有CA根证书 1.创建CA目录 root@DESKTOP-JP3S3AN:/home/wsl/openssl_pro# mkdir -pv /etc/pki/CA/{private,cert ...

  6. java初始化实例化_Java对象的创建过程:类的初始化与实例化

    一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...

  7. java ssl 无证书_java – 如何修复SSL – 没有可用的证书

    我想使用以下代码建立服务器SSL套接字连接: int port = 12000; ServerSocketFactory ssocketFactory = SSLServerSocketFactory ...

  8. java sound 数据处理_Java Sound API:捕获目标端口的声音输出

    我正在编写一个简单的软件,通过LAN传输音频.我已经实现了所有网络部分,但我磕磕绊绊的是使用 Java Sound API.我已成功捕获麦克风的音频和线路输入,但我似乎无法从任何目标端口捕获,如扬声器 ...

  9. java map增加值_Java程序以创建HashMap并添加键值对

    要创建HashMap,请使用HashMap类-HashMap hm = new HashMap(); 以键值对形式将元素添加到HashMap-hm.put("Bag", new I ...

最新文章

  1. Lines色线halcon算子,持续更新
  2. javaslang_使用Javaslang的Java 8中的功能数据结构
  3. iosid不足以修改问题_寻找合作伙伴的技巧足以与您合作
  4. 最全的测试工具以及测试需要掌握的工具
  5. 百度360搜狗神马今日头条抖音获客方法解析|昔年优化推广
  6. vivado global和out-of-context 选项
  7. 【codeVS 1082】树状数组(区间修改,区间查询)模版题
  8. xftp地址栏消失解决办法
  9. PDF Candy Desktop(全能PDF工具箱)官方中文版V2.91 | pdf candy desktop官网下载 | 含pdf candy desktop使用教程
  10. 推荐几个高质量的软件测试实战项目
  11. C语言 case语句 连续值,对一个switch case语句使用两个值
  12. Nexmoe 博客主题的设计理念
  13. 正大期货市场基础知识
  14. 配饰 女生的第二件衣服
  15. JS进阶学习之ES5-ES6
  16. java jdbc 批量更新_java – JDBC PreparedStatement,批量更新和生成的密钥
  17. 定时循环发送UDP消息(例如:控制远程电脑的开机、关机、重启、打开和关闭程序等)—— 定时执行专家
  18. 入职4个月后,对于web开发的心得
  19. R5S RK3568运行安卓12搭配即插即用免驱免拨号的4G LTE模组测速演示
  20. 众安在线2019年净亏损4.5亿,消金保费收入降12%,赔付率升至97%

热门文章

  1. 电子科技大学数据库与软件工程实验四(课程设计)
  2. VIM 搜索时的大小写敏感
  3. matlab三维图像比较,matlab 画三维图像
  4. 烤仔建工 | 友谊长存,2022新年派对中韩社区艺术交流展圆满落幕
  5. BIEE使用体验 – 关于时间格式
  6. 引用传递(passing by references) 在C语言和C++中的区别
  7. vue2中components是干嘛用的
  8. json转换成实体类
  9. 2016百度之星 - 资格赛(Astar Round1) B
  10. Unity3D随意截图并保存