好用实际的X50证书生成工具

该代码示例展示了如何在Java中使用BouncyCastle库生成X509证书,包括创建KeyPair、设置证书信息、签名以及存储到KeyStore的过程。此外,还包含了读取和打印KeyStore中证书信息的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package net.oppf.api.oppfidp.util;

import cn.hutool.core.codec.Base64;
import cn.hutool.core.lang.Console;
import org.bouncycastle.asn1.ASN1InputStream;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.cert.X509CertificateHolder;
import org.bouncycastle.cert.X509v3CertificateBuilder;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.operator.ContentSigner;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;

import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.math.BigInteger;
import java.security.*;
import java.security.cert.Certificate;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Calendar;
import java.util.Date;
import java.util.Enumeration;

/**

  • 用于生成 X509 证书和jks

  • @author *****

  • @date 2023/4/17 9:06
    */
    public class X509CertUtil {

    public static final String Default_keyType = “jks”;//存储证书keyStore类型 PKCS12
    public static final String Default_KeyPairGenerator = “RSA”;//非对称加密算法
    public static final String Default_Signature = “SHA1withRSA”;//签名算法:RSA签名,用MD5哈希算法摘要
    public static final String cert_type = “X509”;//证书类型
    public static final Integer Default_KeySize = 2048;

    static {
    //系统添加BC加密算法,以后系统中调用的算法都是BC的算法
    Security.addProvider(new BouncyCastleProvider());
    }

    /**

    • 生成证书

    • @param issuer

    • @param notBefore

    • @param notAfter

    • @param certDestPath

    • @param serial

    • @param keyPassword

    • @param alias

    • @throws Exception
      */
      public static void createCert(String issuer, Date notBefore, Date notAfter, String certDestPath, BigInteger serial, String keyPassword, String alias) throws Exception {
      //产生公私钥对
      KeyPairGenerator kpg = KeyPairGenerator.getInstance(Default_KeyPairGenerator);
      kpg.initialize(Default_KeySize);
      KeyPair keyPair = kpg.generateKeyPair();
      PublicKey publicKey = keyPair.getPublic();
      PrivateKey privateKey = keyPair.getPrivate();

      //组装证书
      X500Name issueDn = new X500Name(issuer);
      X500Name subjectDn = new X500Name(issuer);

      //组装公钥信息
      SubjectPublicKeyInfo subjectPublicKeyInfo = SubjectPublicKeyInfo.getInstance(new ASN1InputStream(publicKey.getEncoded()).readObject());

      X509v3CertificateBuilder builder = new X509v3CertificateBuilder(issueDn, serial, notBefore, notAfter, subjectDn, subjectPublicKeyInfo);

      //证书签名数据
      ContentSigner signGen = new JcaContentSignerBuilder(Default_Signature).build(privateKey);
      X509CertificateHolder holder = builder.build(signGen);
      byte[] certBuf = holder.getEncoded();
      X509Certificate certificate = (X509Certificate) CertificateFactory.getInstance(cert_type).generateCertificate(new ByteArrayInputStream(certBuf));
      // System.out.println(Base64.encode(certificate.getEncoded()));

      Console.log(Base64.encode(certificate.getEncoded()));
      //创建KeyStore,存储证书
      KeyStore store = KeyStore.getInstance(Default_keyType);
      store.load(null, null);
      store.setKeyEntry(alias, keyPair.getPrivate(), keyPassword.toCharArray(), new java.security.cert.Certificate[]{certificate});
      FileOutputStream fout = new FileOutputStream(certDestPath);
      store.store(fout, keyPassword.toCharArray());
      fout.close();
      }

    public static void printCert(String certPath, String keyPassword) throws Exception {
    //char[] charArray = keyPassword.toCharArray();
    //KeyStore ks = KeyStore.getInstance(Default_keyType);
    //FileInputStream fis = new FileInputStream(certPath);
    //ks.load(fis, charArray);
    //fis.close();
    //System.out.println(“keystore type=” + ks.getType());
    //Enumeration enumas = ks.aliases();
    //String keyAlias = null;
    //if (enumas.hasMoreElements()) {
    // keyAlias = (String) enumas.nextElement();
    // System.out.println(“alias=[” + keyAlias + “]”);
    //}
    //System.out.println(“is key entry=”+ks.isKeyEntry(keyAlias));
    //PrivateKey prikey = (PrivateKey) ks.getKey(keyAlias, charArray);
    //Certificate cert = ks.getCertificate(keyAlias);
    //PublicKey pubkey = cert.getPublicKey();
    //System.out.println("cert class = "+ cert.getClass().getName());
    //System.out.println("cert= "+cert);
    //System.out.println("public key = "+pubkey);
    //System.out.println("private key = "+prikey);

     char[] charArray = keyPassword.toCharArray();
     KeyStore ks = KeyStore.getInstance(Default_keyType);
     FileInputStream fis = new FileInputStream(certPath);
     ks.load(fis, charArray);
     fis.close();
     System.out.println("keystore type=" + ks.getType());
     Enumeration enumas = ks.aliases();
     String keyAlias = null;
     while (enumas.hasMoreElements()) {
         keyAlias = (String) enumas.nextElement();
         System.out.println("alias=[" + keyAlias + "]");
         System.out.println("is key entry="+ks.isKeyEntry(keyAlias));
         PrivateKey prikey = (PrivateKey) ks.getKey(keyAlias, charArray);
         Certificate cert = ks.getCertificate(keyAlias);
         PublicKey pubkey = cert.getPublicKey();
         System.out.println("cert class = "+ cert.getClass().getName());
         System.out.println("cert= "+cert);
         System.out.println("public key = "+pubkey);
         System.out.println("private key = "+prikey);
     }
    

    }

    public static PublicKey getPublicKey(String certPath, String keyPassword) throws Exception {
    char[] charArray = keyPassword.toCharArray();
    KeyStore ks = KeyStore.getInstance(Default_keyType);
    FileInputStream fis = new FileInputStream(certPath);
    ks.load(fis, charArray);
    fis.close();
    Enumeration enumas = ks.aliases();
    String keyAlias = null;
    if (enumas.hasMoreElements()) {
    keyAlias = (String) enumas.nextElement();
    return ks.getCertificate(keyAlias).getPublicKey();
    }
    return null;
    }

    public static PrivateKey getPrivateKey(String certPath, String keyPassword) throws Exception {
    char[] charArray = keyPassword.toCharArray();
    KeyStore ks = KeyStore.getInstance(Default_keyType);
    FileInputStream fis = new FileInputStream(certPath);
    ks.load(fis, charArray);
    fis.close();
    Enumeration enumas = ks.aliases();
    String keyAlias = null;
    if (enumas.hasMoreElements()) {
    keyAlias = (String) enumas.nextElement();
    return (PrivateKey) ks.getKey(keyAlias, charArray);
    }
    return null;
    }

    public void certDelayTo(Date endTime, String certPath, String keyPassword) throws Exception {

    }

    public static void changePassword(String certPath, String oldPwd, String newPwd) throws Exception {
    KeyStore ks = KeyStore.getInstance(Default_keyType);
    FileInputStream fis = new FileInputStream(certPath);
    ks.load(fis, oldPwd.toCharArray());
    fis.close();
    FileOutputStream fout = new FileOutputStream(certPath);
    ks.store(fout,newPwd.toCharArray());
    fout.close();
    }

    public static void deleteAlias(String certPath, String keyPassword, String alias, String entry) throws Exception {
    char[] charArray = keyPassword.toCharArray();
    KeyStore ks = KeyStore.getInstance(Default_keyType);
    FileInputStream fis = new FileInputStream(certPath);
    ks.load(fis, charArray);
    fis.close();
    if (ks.containsAlias(alias)){
    ks.deleteEntry(entry);
    FileOutputStream fout = new FileOutputStream(certPath);
    ks.store(fout,keyPassword.toCharArray());
    fout.close();
    }else {
    throw new Exception(“该证书未包含别名------->”+alias);
    }
    }

    public static void main(String[] args) throws Exception {
    // 1.创建证书
    String issuer=“C=CN,ST=BJ,L=HangZhou,O=xingeei.mynatapp,OU=xingeei.mynatapp,CN=xxxxxx.com”;
    String certDestPath=“E:\test.jks”;
    BigInteger serial=BigInteger.valueOf(System.currentTimeMillis());
    String keyPassword=“123456”;
    String alias=“http://xingeei.mynatapp.cc/realms/AWSDemo”;

     Calendar calendar = Calendar.getInstance();
     calendar.add(Calendar.YEAR,5);
    
     createCert(issuer,new Date(),calendar.getTime(),certDestPath,serial,keyPassword,alias);
     System.out.println("创建证书成功");
    
     //2.遍历打印证书信息
    

// X509CertDaoImpl impl = new X509CertDaoImpl();
// impl.printCert(“E:\test.p12”,“123456”);

    //3.DateUtils的使用
    //Date date = DateUtils.parseDate("2021-11-12 09:50:00", new String[]{"yyyy-MM-dd HH:mm:ss"});
    //System.out.println(date.toLocaleString());

    //4.枚举的遍历问题
    //char[] charArray = "123456".toCharArray();
    //KeyStore ks = KeyStore.getInstance(Default_keyType);
    //FileInputStream fis = new FileInputStream("E:\\iotest\\cert\\test.p12");
    //ks.load(fis, charArray);
    //fis.close();
    //System.out.println("keystore type=" + ks.getType());
    //Enumeration enumas = ks.aliases();
    //ArrayList<String> aliasList = new ArrayList<>();
    //String [] keyAlias = null;
    //while (enumas.hasMoreElements()) {
    //    String alias = (String) enumas.nextElement();
    //    aliasList.add(alias);
    //}
    //System.out.println(aliasList);
}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值