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);
}
}