【SM2根证书】签发SM2证书

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

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值