引入 API

     <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.64</version></dependency>

创建 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, EMAILADDRESS=Name@gmail.com");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, "email=666@gmail.com")});extensionsGenerator.addExtension(Extension.subjectAlternativeName, false, generalNames);builder.addAttribute(PKCSObjectIdentifiers.pkcs_9_at_extensionRequest, extensionsGenerator.generate());// build csrPKCS10CertificationRequest csr = builder.build(signGen);// 输出 PEM 格式的 CSROutputStreamWriter 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 格式的 CSRPKCS10CertificationRequest 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 bouncycastle API 创建 CSR 和签发证书相关推荐

  1. java csr 证书_Java bouncycastle API 创建 CSR 和签发证书

    引入 API org.bouncycastle bcprov-jdk15on 1.64 创建 CSR CSR,即证书请求文件(Certificate Signing Request).生成 X509 ...

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

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

  3. Java安全教程–创建SSL连接和证书的分步指南

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

  4. openssl创建CA并签发证书

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

  5. hive创建java函数_spark通过java的api创建hive的UDF用户自定义函数

    public class UDF { public static void main(String[] args) { SparkConf conf = new SparkConf().setMast ...

  6. keytool生成证书_创建自签名ssl证书,Java生产jks证书

    一.创建自签名ssl证书 下载openssl软件: https://pan.baidu.com/s/1Zy4W7pqSO8caoR_R5pF3DQ  #提取码:bjd4 设置环境变量 进入openss ...

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

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

  8. 使用 openssl 创建自签发证书,含 IP证书 及 泛域名证书

    web里面需要使用ssl才能使用,所以需要使用域名证书: 1. 创建根证书 创建秘钥 openssl genrsa -out LocalRootCA.key 2048 生成证书并自签名,nodes是不 ...

  9. OpenSSL API 签发证书

    /**  * @file cert_openssl.c  * @brief 利用openssl api处理证书  * @author zy  * @date 2014-10-11 modify  */ ...

最新文章

  1. 【Spring学习笔记】之【2.3Ioc配置使用】
  2. [转]Android最佳实践之:StrictMode介绍
  3. 如何用MathType插入公式编号
  4. R语言应用实战-基于R浅谈SEIR传染病模型以以及马尔萨斯,logistic模型(推导过程和源代码)
  5. 2020 年值得再读一遍的网易云信技术干货 | 上篇
  6. 在一个电子商务网站应用中,涉及的实体信息类有很多,比如用户类User和用户地址类Address; 而每一个实体类的对象信息要存储到相应的数据库表中,如userTable和addressTable。
  7. dotnet 在 UOS 国产系统上使用 Xamarin Forms 创建 xaml 界面的 GTK 应用
  8. 构建电商网站业务安全系统,防止“薅羊毛”
  9. 人工智能的前景:更高智慧的体的诞生
  10. Object类 java 1614965390
  11. qq文件对方接收后一定会有提示吗_QQ要增加消息已读功能,你是否赞成?
  12. Android studio如何打包APK文件
  13. css3制作的载入动画效果,效果很震撼!
  14. PHP集成环境MxSrvs如何安装pcntl扩展
  15. HTML列表、表格与媒体元素
  16. word pdf 互转
  17. html--P11-P20
  18. 游戏设计之基于高程图的三维地形绘制
  19. 小爱触屏音响用php接口,小米小爱触屏音箱:这个“闹钟”不简单
  20. IBM:协作有道 创新无限

热门文章

  1. Python异常 TypeError
  2. NFS故障:Stale NFS file handle的解决一例
  3. word转html如何换行,使用XWPF导出word时内容如何换行
  4. 区块链100讲:从村里的账本来看什么是区块链
  5. 职称 计算机及应用工程师,中级工程师职称需要计算机应用能力几级
  6. 一个温州山村的区块链“突围”
  7. 03.安装部署MGR集群 | 深入浅出MGR
  8. Loadrunner 测试https请求配置
  9. 为什么说手工表格管理固定资产已经OUT了?
  10. pycharm2017 激活码