【SM2证书】签发SM2根证书 (精简、直接)
0.程序员专用开头:
1.项目结构:
2. 源码:
AlgSm2Demo.java (签名验签)
package alg.sm2demo;import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.math.ec.ECPoint;
import org.bouncycastle.util.encoders.Hex;import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.spec.ECGenParameterSpec;/*** SM2 算法 Demo** @author Cliven* @date 2018-12-20 10:42:22*/
public class AlgSm2Demo {public static void main(String[] args) throws NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, SignatureException {// 获取SM2椭圆曲线的参数final ECGenParameterSpec sm2Spec = new ECGenParameterSpec("sm2p256v1");// 获取一个椭圆曲线类型的密钥对生成器final KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", new BouncyCastleProvider());// 使用SM2参数初始化生成器kpg.initialize(sm2Spec);// 获取密钥对KeyPair keyPair = kpg.generateKeyPair();PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();// ------------------------ SM2未压缩公钥 ----------------------------// 椭圆曲线公钥的点坐标ECPoint pubKeyPointQ = ((BCECPublicKey) publicKey).getQ();System.out.println("X: \n" + pubKeyPointQ.getXCoord());System.out.println("Y: \n" + pubKeyPointQ.getYCoord());// 将其表示为SM2未压缩的公钥为System.out.println("SM2 public key: \n"+ "04"+ pubKeyPointQ.getXCoord().toString()+ pubKeyPointQ.getYCoord().toString());// ------------------------ SM2未压缩公钥 -------------------------------System.out.println("Public key: \n" + Hex.toHexString(publicKey.getEncoded()));System.out.println("Private key: \n" + Hex.toHexString(privateKey.getEncoded()));// 生成SM2sign with sm3 签名验签算法实例Signature signature = Signature.getInstance("SM3withSm2", new BouncyCastleProvider());/** 签名*/// 签名需要使用私钥,使用私钥 初始化签名实例signature.initSign(privateKey);// 签名原文byte[] plainText = "你好".getBytes(StandardCharsets.UTF_8);// 写入签名原文到算法中signature.update(plainText);// 计算签名值byte[] signatureValue = signature.sign();System.out.println("signature: \n" + Hex.toHexString(signatureValue));/** 验签*/// 签名需要使用公钥,使用公钥 初始化签名实例signature.initVerify(publicKey);// 写入待验签的签名原文到算法中signature.update(plainText);// 验签System.out.println("Signature verify result: " + signature.verify(signatureValue));}
}
SM2CertDemo.java (签发证书)
package alg.sm2demo;import java.io.IOException;
import java.math.BigInteger;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.InvalidAlgorithmParameterException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.security.PublicKey;
import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Date;import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.asn1.misc.MiscObjectIdentifiers;
import org.bouncycastle.asn1.misc.NetscapeCertType;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x500.X500NameBuilder;
import org.bouncycastle.asn1.x500.style.BCStyle;
import org.bouncycastle.asn1.x509.Extension;
import org.bouncycastle.asn1.x509.KeyPurposeId;
import org.bouncycastle.cert.X509v3CertificateBuilder;
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder;
import org.bouncycastle.jce.X509KeyUsage;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.operator.ContentSigner;
import org.bouncycastle.operator.OperatorCreationException;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
import org.bouncycastle.util.encoders.Base64;/*** SM2 X.509签名制作Demo** @author jy* @date 2018-12-21 14:04*/
public class SM2CertDemo {/*** BouncyCastle算法提供者*/private static final Provider BC = new BouncyCastleProvider();/*** 获取扩展密钥用途** @return 增强密钥用法ASN.1对象* @author Cliven* @date 2018-12-21 16:04:58*/public static DERSequence extendedKeyUsage() {// // 客户端身份认证// ASN1ObjectIdentifier clientAuth = new// ASN1ObjectIdentifier("1.3.6.1.5.5.7.3.2");// // 安全电子邮件// ASN1ObjectIdentifier emailProtection = new// ASN1ObjectIdentifier("1.3.6.1.5.5.7.3.4");// 构造容器对象ASN1EncodableVector vector = new ASN1EncodableVector();// 客户端身份认证vector.add(KeyPurposeId.id_kp_clientAuth);// 安全电子邮件vector.add(KeyPurposeId.id_kp_emailProtection);return new DERSequence(vector);}/*** 生成证书文件** @param x509Certificate* X.509格式证书* @param savePath* 证书保存路径* @throws CertificateEncodingException* @throws IOException* @author Cliven* @date 2018-12-21 17:21:50*/public static void makeCertFile(X509Certificate x509Certificate, Path savePath)throws CertificateEncodingException, IOException {if (Files.exists(savePath)) {// 删除已存在文件Files.deleteIfExists(savePath);}// 创建文件Files.createFile(savePath);// 获取ASN.1编码的证书字节码byte[] asn1BinCert = x509Certificate.getEncoded();// 编码为BASE64 便于传输byte[] base64EncodedCert = Base64.encode(asn1BinCert);// 写入文件Files.write(savePath, base64EncodedCert);}public static void main(String[] args) throws InvalidAlgorithmParameterException, NoSuchAlgorithmException,OperatorCreationException, IOException, CertificateException {// 生成密钥生成器, 产生密钥对KeyPairGenerator keyPairGenerator = SM2KeyGenerateFactory.generator();KeyPair keyPair = keyPairGenerator.generateKeyPair();// 证书签名实现类 附加了 SM3WITHSM2 和 PrivateKeyJcaContentSignerBuilder jcaContentSB = new JcaContentSignerBuilder("SM3withSM2");jcaContentSB.setProvider(new BouncyCastleProvider());ContentSigner sigGen = jcaContentSB.build(keyPair.getPrivate());// 准备证书信息BigInteger sn = BigInteger.valueOf(System.currentTimeMillis());X500Name issuer = createX500Name("yan");X500Name subject = createX500Name("yan");Date notBefore = new Date();Date notAfter = new Date(System.currentTimeMillis() + 50 * 1000);PublicKey publickey = keyPair.getPublic();// 构造证书信息JcaX509v3CertificateBuilder jcaX509v3Cert = new JcaX509v3CertificateBuilder(issuer, sn, notBefore, notAfter,subject, publickey);jcaX509v3Cert.addExtension(Extension.keyUsage, false,new X509KeyUsage(X509KeyUsage.digitalSignature | X509KeyUsage.nonRepudiation));jcaX509v3Cert.addExtension(Extension.extendedKeyUsage, false, extendedKeyUsage());jcaX509v3Cert.addExtension(MiscObjectIdentifiers.netscapeCertType, false,new NetscapeCertType(NetscapeCertType.sslClient));// 构造X.509 第3版的证书构建者X509v3CertificateBuilder x509v3Cert = jcaX509v3Cert;// 将证书构造参数装换为X.509证书对象X509Certificate certificate = new JcaX509CertificateConverter().setProvider(BC).getCertificate(x509v3Cert.build(sigGen));// 保存为证书文件makeCertFile(certificate, Paths.get("sm2_jy.cer"));System.out.println("gen cert succ!");}// 构造 主题名称public static X500Name createX500Name(String cn) {X500NameBuilder builder = new X500NameBuilder(BCStyle.INSTANCE);// 国家代码builder.addRDN(BCStyle.C, "CN");// 组织builder.addRDN(BCStyle.O, "info");// 省份builder.addRDN(BCStyle.ST, "beijing");// 地区builder.addRDN(BCStyle.L, "beijing");// 身份builder.addRDN(BCStyle.CN, cn);X500Name subject = builder.build();return subject;}}
SM2KeyGenerateFactory.java (产生SM2 密钥对)
package alg.sm2demo;import java.security.InvalidAlgorithmParameterException;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.spec.ECGenParameterSpec;import org.bouncycastle.jce.provider.BouncyCastleProvider;/*** SM2密钥对生成器** @author Cliven* @date 2018-12-21 14:05*/
public class SM2KeyGenerateFactory {/*** 获取SM2密钥对生成器** @return SM2密钥对生成器* @throws NoSuchAlgorithmException* @author Cliven* @date 2019-6-10 15:56:36*/public static KeyPairGenerator generator() throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
/*// 获取SM2 椭圆曲线推荐参数X9ECParameters ecParameters = GMNamedCurves.getByName("sm2p256v1");// 构造EC 算法参数ECNamedCurveParameterSpec sm2Spec = new ECNamedCurveParameterSpec(// 设置SM2 算法的 OIDGMObjectIdentifiers.sm2p256v1.toString()// 设置曲线方程, ecParameters.getCurve()// 椭圆曲线G点, ecParameters.getG()// 大整数N, ecParameters.getN());// 创建 密钥对生成器final KeyPairGenerator gen = KeyPairGenerator.getInstance("EC", new BouncyCastleProvider());// 使用SM2的算法区域初始化密钥生成器kpg.initialize(sm2Spec, new SecureRandom());return gen;
*//** 上面过程为原始构造过程参考,BC已经为我们封装好了* 只需要下面三行代码即可*/// 获取SM2椭圆曲线的参数final ECGenParameterSpec sm2Spec = new ECGenParameterSpec("sm2p256v1");// 获取一个椭圆曲线类型的密钥对生成器final KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", new BouncyCastleProvider());// 使用SM2参数初始化生成器kpg.initialize(sm2Spec);return kpg;}
}
执行 SM2CertDemo 的 main 方法即可,产生 SM2 证书。
3. 效果:
【SM2证书】签发SM2根证书 (精简、直接)相关推荐
- SSL证书的根证书和中间根证书的区别
SSL证书的根证书和中间根证书的区别. 什么是根证书? 根证书是指CA机构颁发SSL证书的核心,是信任链的起始点. 根证书是浏览器是否对SSL证书每个浏览器都有一个根证书库?有的浏览器是采用自主的根证 ...
- 根证书和中间根证书之间有什么区别?
随着SSL证书的广泛应用,申请SSL证书的人也越来越多,但是很多使用SSL证书的用户其实并不太了解SSL证书.他们仅仅是因为要把站点从HTTP转换到HTTPS而申请使用SSL证书,而最终用户也只是获取 ...
- SSL数字证书之CA根证书、CA中间证书和SSL证书
[前言] 说一下大背景吧,我们的一个后台服务需要部署在一个没法上外网的环境,但是我们的后台服务需要访问七牛云进行对象存储,于是乎,需要一个代理来完成这个访问,我门采用nginx七层来做这个代理,因为七 ...
- openssl命令生成根证书和使用根证书签名工作证书
建立根证书流程如下: //生成私钥,产生CARoot.key文件,需要输入私钥保护口令 openssl genrsa -des3 -out CARoot.key 2048 //生成证书请求,需要输入C ...
- java 创建根证书_创建根证书及其子证书
"CN=***" ,不然证书就和域名不一致了,至于其他就是文件名,无所谓了! 1. 使用MakeCert.exe创建一个自签名的根证书 makecert -n "CN=w ...
- 卸载计算机安全证书,如何卸载ssl证书_卸载根证书的操作指南_什么是SSL卸载,SSL卸载优点有哪些? - 沃通SSL证书...
ssl卸载 2019-10-31 什么是SSL卸载?今天我们将讨论一个经常出现的问题,对于那些没有IT背景的人来说,这可能会显得特别陌生:什么是SSL卸载?我们将快速概述一下SSL卸载意味着什么,为什 ...
- http系列---OpenSSL生成根证书CA及签发子证书
文章目录 1. 前言 2. 修改OpenSSL的配置 3. 生成根证书 4. 用根证书签发server端证书 5. 用根证书签发client端证书 6. 导出证书 7. 附项目证书目录 1. 前言 系 ...
- OpenSSL生成根证书CA及签发子证书
转自:https://yq.aliyun.com/articles/40398 摘要: 系统:CentOS7 32位 目标:使用OpenSSL生成一个CA根证书,并用这个根证书颁发两个子证书serve ...
- 自建ca根证书_如何创建私有 CA 并签发证书
为什么需要自己的 CA? 因为公共 CA (比如排名前几的这几家:Comodo, Symantec, GlobalSign, DigiCert, StartCom)颁发证书要收费,而且价格很贵.当然现 ...
- 什么是根证书和中间证书(中级证书)?
什么是根证书和中间证书(中级证书)? 随着SSL证书的广泛应用,申请SSL证书的人也越来越多,但是很多使用SSL证书的用户其实并不太了解SSL证书.他们仅仅是因为要把站点从HTTP转换到HTTPS而申 ...
最新文章
- NetBeans常用快捷键
- 观峰雨个人空间 2010 STOCK ADVICE !
- java 根据ip获取dns_Java技巧: 根据网址查询DNS/IP地址
- python opencv 凸包
- 决策树剪枝算法(二)
- mysql 分段解析_MYSQL分段统计
- SecureCRT更改字体
- 基于贝叶斯分类的中文人名用字特征的性别识别
- 渣打称中国房市出现泡沫
- linux mysql5.7免安装版配置_MySQL5.7免安装版配置
- Page Cache:为什么我的容器内存使用量总是在临界点?
- VRChat简易教程1-开发环境准备(SDK)
- zigbee入网过程深入解析(Ubiqua抓包)
- 赛门铁克通配符SSL证书,一张通配型证书实现全站加密
- 最简单的线性回归模型 李烨_模型
- 海思3516av300开机logo
- Odoo 16 企业版手册 - CRM (2)
- 龙芯2F内核损坏解决办法
- Python 看门狗功能实现
- 统计系列(四)利用Python进行假设检验