首页 > 编程语言 >通过Java和ECDSA生成X509版本的证书

通过Java和ECDSA生成X509版本的证书

时间:2023-11-26 17:15:30浏览次数:33  
标签:Beijing Java String X509 bouncycastle new org import ECDSA

1.创新maven项目导入相关依赖

<dependencies>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcpkix-jdk15on</artifactId>
            <version>1.70</version>
        </dependency>
        <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-ext-jdk15on</artifactId>
            <version>1.70</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>
    </dependencies>

2.通过ECDSA生成私钥和公钥信息

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");
ECGenParameterSpec ecSpec = new ECGenParameterSpec("secp256r1");
keyPairGenerator.initialize(ecSpec, new SecureRandom());
KeyPair keypair = keyPairGenerator.generateKeyPair();
PrivateKey priv = keypair.getPrivate();
PublicKey pub = keypair.getPublic();

3.设置证书相关信息

// 用户信息
X500Name subject = generateSubject("CN", "Beijing", "Beijing", "Nichols' company", "Nichols' org", "Nichols/UID=13336");
// 颁发机构信息
X500Name issuer = generateSubject("CN", "Beijing", "Beijing", "org1", "org1.depart1", "ca.org1");
long currentTime = System.currentTimeMillis();
X509v3CertificateBuilder x509v3CertificateBuilder
        = new JcaX509v3CertificateBuilder(issuer, BigInteger.valueOf(System.currentTimeMillis()),
           new Date(currentTime),new Date(currentTime + (long) 365 * 24 * 60 * 60 * 1000),subject,pub);
JcaContentSignerBuilder ecdsa = new JcaContentSignerBuilder("SHA256withECDSA");
ContentSigner contentSigner = ecdsa.build(priv);
X509CertificateHolder x509CertificateHolder = x509v3CertificateBuilder.build(contentSigner);
Certificate certificate = x509CertificateHolder.toASN1Structure();

4.存储证书文件

byte[] encoded = certificate.getEncoded();
String certStr = Base64.getEncoder().encodeToString(encoded);
String certFileContent = "" +
          "-----BEGIN CERTIFICATE-----\n" +
          lf(certStr, 64) +
          "-----END CERTIFICATE-----";
// 这里存储为cer文件,也可存为pem文件
FileUtils.write(new File("D:\\testCert.cer"),certFileContent, StandardCharsets.UTF_8);

5.windows/linux查看cer文件

windows

linux

openssl x509 -in 文件名.cer -text -noout

6.完整Java代码

package org.nichols;

import org.apache.commons.io.FileUtils;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x500.X500NameBuilder;
import org.bouncycastle.asn1.x500.style.BCStyle;
import org.bouncycastle.asn1.x509.Certificate;
import org.bouncycastle.cert.X509CertificateHolder;
import org.bouncycastle.cert.X509v3CertificateBuilder;
import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder;
import org.bouncycastle.operator.ContentSigner;
import org.bouncycastle.operator.OperatorCreationException;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;

import java.io.File;
import java.io.IOException;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.ECGenParameterSpec;
import java.util.Base64;
import java.util.Date;

/**
 * @author nichols
 * @date ${DATE} ${TIME}
 */
public class GenerateX509Cert {
    public static void main(String[] args) throws NoSuchAlgorithmException, InvalidAlgorithmParameterException, OperatorCreationException, IOException {
        X500Name subject = generateSubject("CN", "Beijing", "Beijing", "Nichols' company", "Nichols' org", "Nichols/UID=13336");
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");
        ECGenParameterSpec ecSpec = new ECGenParameterSpec("secp256r1");
        keyPairGenerator.initialize(ecSpec, new SecureRandom());
        KeyPair keypair = keyPairGenerator.generateKeyPair();
        PrivateKey priv = keypair.getPrivate();
        PublicKey pub = keypair.getPublic();
        X500Name issuer = generateSubject("CN", "Beijing", "Beijing", "org1", "org1.depart1", "ca.org1");
        long currentTime = System.currentTimeMillis();
        X509v3CertificateBuilder x509v3CertificateBuilder
                = new JcaX509v3CertificateBuilder(issuer, BigInteger.valueOf(System.currentTimeMillis()),
                new Date(currentTime),new Date(currentTime + (long) 365 * 24 * 60 * 60 * 1000),subject,pub);
        JcaContentSignerBuilder ecdsa = new JcaContentSignerBuilder("SHA256withECDSA");
        ContentSigner contentSigner = ecdsa.build(priv);
        X509CertificateHolder x509CertificateHolder = x509v3CertificateBuilder.build(contentSigner);
        Certificate certificate = x509CertificateHolder.toASN1Structure();
        byte[] encoded = certificate.getEncoded();
        String certStr = Base64.getEncoder().encodeToString(encoded);
        String certFileContent = "" +
                "-----BEGIN CERTIFICATE-----\n" +
                lf(certStr, 64) +
                "-----END CERTIFICATE-----";
        FileUtils.write(new File("D:\\testCert.cer"),certFileContent, StandardCharsets.UTF_8);
    }

    /**
     * 生成Subject信息
     *
     * @param C  Country Name (国家代号),eg: CN
     * @param ST State or Province Name (洲或者省份),eg: Beijing
     * @param L  Locality Name (城市名),eg: Beijing
     * @param O  Organization Name (可以是公司名称),
     * @param OU Organizational Unit Name (可以是单位部门名称)
     * @param CN Common Name (服务器ip或者域名),eg: 192.168.30.71 or www.baidu.com
     * @return X500Name Subject
     */
    public static X500Name generateSubject(String C, String ST, String L,
                                           String O, String OU, String CN) {
        X500NameBuilder x500NameBuilder = new X500NameBuilder();
        x500NameBuilder.addRDN(BCStyle.C, C);
        x500NameBuilder.addRDN(BCStyle.ST, ST);
        x500NameBuilder.addRDN(BCStyle.L, L);
        x500NameBuilder.addRDN(BCStyle.O, O);
        x500NameBuilder.addRDN(BCStyle.OU, OU);
        x500NameBuilder.addRDN(BCStyle.CN, CN);
        return x500NameBuilder.build();
    }
    public static String lf(String str, int lineLength) {
        assert str != null;
        assert lineLength > 0;
        StringBuilder sb = new StringBuilder();
        char[] chars = str.toCharArray();
        int n = 0;
        for (char aChar : chars) {
            sb.append(aChar);
            n++;
            if (n == lineLength) {
                n = 0;
                sb.append("\n");
            }
        }
        if (n != 0)
            sb.append("\n");
        return sb.toString();
    }
}

ok,本文到此结束。关注“李让行人软件开发分享”微信公众号,带你了解更有趣的知识!

标签:Beijing,Java,String,X509,bouncycastle,new,org,import,ECDSA
From: https://www.cnblogs.com/nichols1205/p/17857537.html

相关文章

  • Java 系统学习 | windows 环境安装 java
    学习语言,首先搭建环境。当前最新是Java21,本篇安装17版本。一、下载进入官网OracleDevelopers开发语言选择JavaDownloads选择JDK选择windows环境的JDK17下载exe文件即可想要其它老版本选择archive二、安装配置双击下载的exe......
  • JavaWeb实现文件的上传和下载
    文件的上传和下载,是非常常见的功能,很多系统,或者软件中经常使用文件的上传和下载.比如QQ头像/邮箱中的上传和下载功能/OA系统中审批中附件的上传.1.文件的上传步骤:有一个form标签,method=post请求form标签的encType属性的值必须为multipart/form-data值在form标签中,使......
  • Java中的事务——JDBC事务和JTA事务
    简介: 本文来介绍一下J2EE中和事务相关的内容,在阅读本文之前,希望读者对分布式有一定的了解。Java事务的类型有三种:JDBC事务、JTA(JavaTransactionAPI)事务、容器事务。本文来介绍一下J2EE中和事务相关的内容,在阅读本文之前,希望读者对分布式有一定的了解。Java事务的类型有三种:JDB......
  • JavaWeb(上)
    1.TomcatTomcat(全称为ApacheTomcat)是一个开源的JavaServlet容器,也是一个能够托管JavaWeb应用的Web服务器。Tomcat的主要功能是解析和执行JavaServlet、JavaServerPages(JSP)和相关的JavaEE技术。它可以作为一个独立的Web服务器运行,也可以与其他HTTP服务器(如ApacheHTTP服务......
  • javaweb项目中的文件上传下载功能的实现
    框架是基于spring+myBatis的。 前台页面的部分代码:<formaction="${ctx}/file/upLoadFile.do"method="post"enctype="multipart/form-data"id="form"><table><tbody><tr><td>上传文件:</td><tdstyle=&......
  • JavaScript-浏览器环境概述
    JavaScript是浏览器的内置脚本语言。也就是说,浏览器内置了JavaScript引擎,并且提供各种接口,让JavaScript脚本可以控制浏览器的各种功能。一旦网页内嵌了JavaScript脚本,浏览器加载网页,就会去执行脚本,从而达到操作浏览器的目的,实现网页的各种动态效果。本章开始介绍浏览器提供......
  • Java互联网+医院智能导诊系统源码 自动兼容H5小程序、Uniapp
    智能导诊系统是一种基于人工智能技术的医疗辅助系统,旨在帮助患者快速找到合适的就诊路径。患者可以通过系统了解医院的科室设置、医生排班、就诊流程等信息,并根据自己的症状和描述,系统会推荐合适的科室和医生。同时,智能导诊系统还可以为医院提供数据分析和决策支持,提高医院的管理效......
  • Java之线程实例(重要)
    接上一章没讲完的线程知识点中关于“死锁”的概念。当线程进入不可运行状态时,其他线程无法访问那个加锁对象,所以一个线程会一直处于等待另一个线程的状态,而另一个线程又会处于等待下一个线程的状态,此时,所有的线程都陷入无休止的等待状态中,无法继续运行,这种情况就被称为线程的“死锁......
  • Java中MongoDB操作
    Java中对MongoDB的操作本文介绍了使用Java编程语言与MongoDB进行交互的基本操作。MongoDB是一个开源的文档数据库,它提供了高性能、可扩展性和灵活的数据存储解决方案。安装MongoDB驱动程序在开始之前,我们需要安装MongoDB的Java驱动程序。你可以通过Maven或手动下载MongoDB驱动程序......
  • 使用JavaWeb实现文件的上传和下载
    文件上传[文件上传的注意事项]1.为保证服务器安全,上传文件应该放在外界无法直接访问的目录下,比如放于WEB-INF目录下。2.为防止文件覆盖的现象发生,要为上传文件产生一个唯一的文件名3.要限制上传文件的最大值。4.可以限制上传文件的类型,在收到上传文件名时,判断后缀名是否合......