网络安全--Java代码生成自颁发 cer证书、base64 cer证书文件

本文介绍如何使用Java(JDK1.8)实现自签名cer证书的生成,内容包括证书的创建过程、代码实现以及可能出现的问题分析。通过提供的代码,可以生成与openssl命令类似的cer证书,并将其转换为Base64编码格式。
摘要由CSDN通过智能技术生成

目录

一、说明

二、实现代码

三、结果分析


一、说明

最近在做一个项目,涉及到数字证书这一块的内容,其中有一个需求是,根据前端维护上送参数, 后台Java实现生成cer自签名证书,证书要求跟openssl命令生成的一样 ,我的java环境是JDK1.8。

网络--keytool CA签名SSL证书(收费)
网络--keytool自签名SSL证书(免费)以及私钥签名、公钥验签

二、实现代码

package com.justin.key;

import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.math.BigInteger;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.security.Security;
import java.security.SignatureException;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
import java.util.Date;
import java.util.HashMap;

import org.bouncycastle.asn1.x509.X509Name;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.x509.X509V3CertificateGenerator;

import sun.misc.BASE64Encoder;

/**
 * Java代码生成自颁发 cer证书、base64 cer证书文件
 * @author justin
 *
 */
public class CreateCerFile {
    
    private String path = "E:/";
    
    private static String CTFC_DOMAIN_NAME = "domainName";			//CN:用户姓名或域名
    private static String CTFC_ORG_UNIT_NAME = "orgUnitName";       //OU:组织单位名称
    private static String CTFC_ORG_NAME = "orgName";                //O:组织名称
    private static String CTFC_COUNTRY_CODE = "countryCode";        //C:单位的两字母国家代码
    private static String CTFC_CITY = "city";                       //L:城市或区域
    private static String CTFC_PROVINCE = "province";               //ST:省份或州
    
    private static String CTFC_VALID_START_TIME = "validStartTime"; //证书有效起始时间                       
    private static String CTFC_VALID_END_TIME = "validEndTime";     //证书有效截止时间                       
    private static String CTFC_SERIAL_NUMBER = "serialNumber";      //序列号域                          
    private static String CTFC_SIG_AlG = "signatureAlgorithm";      //签名算法
    private static String CTFC_ENCRYPT_TYPE = "encryptType";      	//加密类型
    private static String CTFC_ENCRYPT_NUM = "encryptNum";      	//加密位数
    private static String CTFC_PROVIDER = "provider";      			//提供人
    
    
 
以下是使用 Java 代码生成后缀为.cer格式的国密证书的示例: ```java import java.io.FileOutputStream; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.Security; import java.security.cert.CertificateEncodingException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import org.bouncycastle.asn1.x500.X500Name; import org.bouncycastle.cert.X509CertificateHolder; import org.bouncycastle.cert.jcajce.JcaCertStore; import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; import org.bouncycastle.cert.jcajce.JcaX509CertificateHolder; import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder; import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder; import org.bouncycastle.cert.jcajce.JcaContentSignerBuilder; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.operator.ContentSigner; import org.bouncycastle.operator.OperatorCreationException; import org.bouncycastle.operator.jcajce.JcaContentVerifierProviderBuilder; import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; import org.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder; import org.bouncycastle.util.encoders.Base64; public class GenerateCer { public static void main(String[] args) throws Exception { Security.addProvider(new BouncyCastleProvider()); // 生成密钥对 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("EC", "BC"); keyPairGen.initialize(256); KeyPair keyPair = keyPairGen.generateKeyPair(); // 创建证书 X500Name issuer = new X500Name("CN=Test CA"); X500Name subject = new X500Name("CN=Test Certificate"); JcaX509v3CertificateBuilder certBuilder = new JcaX509v3CertificateBuilder(issuer, BigInteger.valueOf(1), new Date(System.currentTimeMillis() - 10000), new Date(System.currentTimeMillis() + 10000), subject, keyPair.getPublic()); JcaContentSignerBuilder csBuilder = new JcaContentSignerBuilder("SM3WITHSM2"); ContentSigner signer = csBuilder.build(keyPair.getPrivate()); X509CertificateHolder certHolder = certBuilder.build(signer); X509Certificate cert = new JcaX509CertificateConverter().getCertificate(certHolder); // 保存证书CER 格式 byte[] encodedCert = cert.getEncoded(); FileOutputStream fos = new FileOutputStream("test.cer"); fos.write(Base64.encode(encodedCert)); fos.close(); // 验证证书 cert.checkValidity(new Date()); cert.verify(cert.getPublicKey(), "BC"); } } ``` 这个例子使用 Bouncy Castle 提供的 API 来生成密钥对和证书,并将证书保存为 CER 格式。其中,`SM3WITHSM2` 是签名算法,可以根据需要替换为其他支持的国密签名算法。生成的证书文件名为 `test.cer`。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吾日三省贾斯汀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值