0. 程序员标配。
记录下 , Java代码签发 SM2证书。
1. Java Project 项目结构:
只需要 两个 java 文件, SM2KeyStore.java GenSM2Certificate.java /
需要导入 如图 四个 jar 。 如何下载 jar,点击 https://mvnrepository.com/
2. 源码展示:
GenSM2Certificate :
package sm2.main;
import java.io.File;
import java.io.FileOutputStream;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.Security;
import java.security.cert.X509Certificate;
import java.util.Date;
import javax.security.auth.x500.X500Principal;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.x509.X509V3CertificateGenerator;
import sm2.key.SM2KeyStore;
public class GenSM2Certificate {
// 产生 SM2 国密证书
public static void genCertificate(){
Security.addProvider(new BouncyCastleProvider());
try {
KeyPair kp = SM2KeyStore.genSM2KeyPair(); // 生成SM2公私钥对
BCECPrivateKey bcecPrivateKey = (BCECPrivateKey) kp.getPrivate(); // 使用ECPrivateKey\PrivateKey都可以
BCECPublicKey bcecPublicKey = (BCECPublicKey) kp.getPublic(); // 使用ECPublicKey\PublicKey都可以
X500Principal principal = new X500Principal("CN=jy,O=info"); // subjectDN
// 填充 证书信息
X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();
certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis()));
certGen.setIssuerDN(principal);
certGen.setNotBefore(new Date());
certGen.setNotAfter(new Date(new Date().getTime() + 1000 * 3600 * 24 * 10));
certGen.setSubjectDN(principal);
certGen.setSignatureAlgorithm("1.2.156.10197.1.501");
certGen.setPublicKey(bcecPublicKey);
// 构造 SM2 证书
X509Certificate rootCert = certGen.generateX509Certificate(bcecPrivateKey, "BC");
// 保存 证书
String filepath = "./sm2_cer_from_jy_01.cer";
File file = new File(filepath);
if (!file.exists()) {
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file);
fos.write(rootCert.getEncoded());
fos.close();
System.out.println("succ");
} catch (Exception e) {
System.out.println("fail");
return;
}
}
public static void main(String[] args) {
genCertificate();
}
}
SM2KeyStore:
package sm2.key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.spec.ECGenParameterSpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
public class SM2KeyStore {
// 产生 SM2 的密钥对
public static KeyPair genSM2KeyPair() throws Exception {
// 获取SM2椭圆曲线的参数
final ECGenParameterSpec sm2Spec = new ECGenParameterSpec("sm2p256v1");
// 获取一个椭圆曲线类型的密钥对生成器
final KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", new BouncyCastleProvider());
// 使用SM2参数初始化生成器
kpg.initialize(sm2Spec);
// 使用SM2的算法区域初始化密钥生成器
kpg.initialize(sm2Spec, new SecureRandom());
// 获取密钥对
KeyPair sm2keyPair = kpg.generateKeyPair();
return sm2keyPair;
}
// 测试
public static void main(String[] args) throws Exception {
KeyPair keyPair = genSM2KeyPair();
keyPair.getPublic();
keyPair.getPrivate();
}
}
执行 只需要 运行 GenSM2Certificate 中的 main 方法即可。产生的证书 文件保存路径默认为项目路径,也可以自行修改。
3.运行结果如图:
eclipse 效果如图:
证书如图:
此版本的代码 在eclipse 会提示 有些方法过时了,但是不影响运行。
over. 后续 会补充 优化代码。
相关jar 文件在 此处:
下载地址为:https://download.csdn.net/upload/11784591
补链接: https://download.csdn.net/download/ca1m0921/11784591