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根证书 (精简、直接)相关推荐

  1. SSL证书的根证书和中间根证书的区别

    SSL证书的根证书和中间根证书的区别. 什么是根证书? 根证书是指CA机构颁发SSL证书的核心,是信任链的起始点. 根证书是浏览器是否对SSL证书每个浏览器都有一个根证书库?有的浏览器是采用自主的根证 ...

  2. 根证书和中间根证书之间有什么区别?

    随着SSL证书的广泛应用,申请SSL证书的人也越来越多,但是很多使用SSL证书的用户其实并不太了解SSL证书.他们仅仅是因为要把站点从HTTP转换到HTTPS而申请使用SSL证书,而最终用户也只是获取 ...

  3. SSL数字证书之CA根证书、CA中间证书和SSL证书

    [前言] 说一下大背景吧,我们的一个后台服务需要部署在一个没法上外网的环境,但是我们的后台服务需要访问七牛云进行对象存储,于是乎,需要一个代理来完成这个访问,我门采用nginx七层来做这个代理,因为七 ...

  4. openssl命令生成根证书和使用根证书签名工作证书

    建立根证书流程如下: //生成私钥,产生CARoot.key文件,需要输入私钥保护口令 openssl genrsa -des3 -out CARoot.key 2048 //生成证书请求,需要输入C ...

  5. java 创建根证书_创建根证书及其子证书

    "CN=***" ,不然证书就和域名不一致了,至于其他就是文件名,无所谓了! 1. 使用MakeCert.exe创建一个自签名的根证书 makecert -n "CN=w ...

  6. 卸载计算机安全证书,如何卸载ssl证书_卸载根证书的操作指南_什么是SSL卸载,SSL卸载优点有哪些? - 沃通SSL证书...

    ssl卸载 2019-10-31 什么是SSL卸载?今天我们将讨论一个经常出现的问题,对于那些没有IT背景的人来说,这可能会显得特别陌生:什么是SSL卸载?我们将快速概述一下SSL卸载意味着什么,为什 ...

  7. http系列---OpenSSL生成根证书CA及签发子证书

    文章目录 1. 前言 2. 修改OpenSSL的配置 3. 生成根证书 4. 用根证书签发server端证书 5. 用根证书签发client端证书 6. 导出证书 7. 附项目证书目录 1. 前言 系 ...

  8. OpenSSL生成根证书CA及签发子证书

    转自:https://yq.aliyun.com/articles/40398 摘要: 系统:CentOS7 32位 目标:使用OpenSSL生成一个CA根证书,并用这个根证书颁发两个子证书serve ...

  9. 自建ca根证书_如何创建私有 CA 并签发证书

    为什么需要自己的 CA? 因为公共 CA (比如排名前几的这几家:Comodo, Symantec, GlobalSign, DigiCert, StartCom)颁发证书要收费,而且价格很贵.当然现 ...

  10. 什么是根证书和中间证书(中级证书)?

    什么是根证书和中间证书(中级证书)? 随着SSL证书的广泛应用,申请SSL证书的人也越来越多,但是很多使用SSL证书的用户其实并不太了解SSL证书.他们仅仅是因为要把站点从HTTP转换到HTTPS而申 ...

最新文章

  1. NetBeans常用快捷键
  2. 观峰雨个人空间 2010 STOCK ADVICE !
  3. java 根据ip获取dns_Java技巧: 根据网址查询DNS/IP地址
  4. python opencv 凸包
  5. 决策树剪枝算法(二)
  6. mysql 分段解析_MYSQL分段统计
  7. SecureCRT更改字体
  8. 基于贝叶斯分类的中文人名用字特征的性别识别
  9. 渣打称中国房市出现泡沫
  10. linux mysql5.7免安装版配置_MySQL5.7免安装版配置
  11. Page Cache:为什么我的容器内存使用量总是在临界点?
  12. VRChat简易教程1-开发环境准备(SDK)
  13. zigbee入网过程深入解析(Ubiqua抓包)
  14. 赛门铁克通配符SSL证书,一张通配型证书实现全站加密
  15. 最简单的线性回归模型 李烨_模型
  16. 海思3516av300开机logo
  17. Odoo 16 企业版手册 - CRM (2)
  18. 龙芯2F内核损坏解决办法
  19. Python 看门狗功能实现
  20. 统计系列(四)利用Python进行假设检验

热门文章

  1. 如何在GraphPad Prism 里创建条形图?
  2. 使用python+opencv写一个简单的条形码识别代码
  3. 自动解题批改与自适应学习 AI在教育行业的应用实践
  4. Linux运维篇之进程管理②
  5. 国庆必备海报文案大礼包,速速收下!
  6. office注意事项
  7. kaldi 的安装和thchs30语音识别测试
  8. pyQt5 学习笔记(2)基本窗口绘画
  9. Elasticsearch 7.10 之 Similarity module
  10. Android手机听筒和扬声器切换