Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4165515
  • 博文数量: 447
  • 博客积分: 1241
  • 博客等级: 中尉
  • 技术积分: 5786
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-27 06:48
个人简介

读好书,交益友

文章分类

全部博文(447)

文章存档

2023年(6)

2022年(29)

2021年(49)

2020年(16)

2019年(15)

2018年(23)

2017年(67)

2016年(42)

2015年(51)

2014年(57)

2013年(52)

2012年(35)

2011年(5)

分类: 网络与安全

2022-05-05 17:59:09

openssl 1.1.1 某个版本是支持sm2算法的,
运行
openssl ecparam -list_curves | grep SM2
返回
 SM2       : SM2 curve over a 256 bit prime field
说明支持
生成SM2格式pri.key私钥
openssl ecparam -genkey -name SM2 -out pri.key

2 根据pri.key生成请求ca-req.csr
openssl req -new -out ca-req.csr -key pri.key
输入各种字段
3 生成公钥证书
openssl x509 -req -in ca-req.csr -out ca-cert.pem -signkey pri.key -days 3650
注意一定要是x509格式的,否则java的bc无法读取
4 生成pfx文件
openssl pkcs12 -export -clcerts -in ca-cert.pem -inkey pri.key -out cert.pfx

5 将私钥转为pem格式
openssl ec -in pri.key -out pri.pem
读取私钥的java代码

点击(此处)折叠或打开

  1. package test;

  2. import org.bouncycastle.cert.CertException;
  3. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  4. import org.bouncycastle.openssl.PEMKeyPair;
  5. import org.bouncycastle.openssl.PEMParser;
  6. import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;

  7. import java.io.FileInputStream;
  8. import java.io.InputStreamReader;
  9. import java.security.PrivateKey;
  10. import java.security.Security;

  11. public class SM2Private {
  12.     public static PrivateKey readPrivateKeyPem(String privateKeyPemPath) throws CertException {
  13.         try {
  14.             PEMParser pemParser = new PEMParser(new InputStreamReader(new FileInputStream(privateKeyPemPath)));
  15.             Object readObject = pemParser.readObject();
  16.             if (readObject instanceof PEMKeyPair) {
  17.                 PEMKeyPair key = (PEMKeyPair) readObject;
  18.                 return new JcaPEMKeyConverter().setProvider(BouncyCastleProvider.PROVIDER_NAME).getKeyPair(key)
  19.                         .getPrivate();
  20.             }
  21.             throw new CertException("read privateKey failed");
  22.         } catch (Exception e) {
  23.             throw new CertException("read privateKey failed", e);
  24.         }
  25.     }
  26.     public static void main(String[] args) throws CertException {
  27.         Security.addProvider(new BouncyCastleProvider());
  28.         PrivateKey privateKey = SM2Private.readPrivateKeyPem("d:/pki/pri.pem");
  29.         System.out.println(privateKey);

  30.     }

  31. }
读取公钥的java代码

点击(此处)折叠或打开

  1. Security.addProvider(new BouncyCastleProvider());

  2.         /**
  3.          * TODO
  4.          * 服务端验签代码,整体认证方案为挑战应答模式
  5.          * 1.后端生产随机数发送前端。
  6.          * 2.前端对随机数进行签名,并发送后端。
  7.          * 3.后端收到签名值结合随机数进行验签完成认证流程。
  8.          */
  9.         //用户公钥,从证书中获取
  10.         PublicKey publicKey = null;

  11.         try {
  12.             byte[] key = Files.readAllBytes(Paths.get("D:\\pki", "ca-cert.pem"));

  13.             Security.addProvider(new BouncyCastleProvider());

  14.             final PemObject pemObject;

  15.             try (PemReader pemReader = new PemReader(new InputStreamReader(
  16.                     new ByteArrayInputStream(key)))) {
  17.                 pemObject = pemReader.readPemObject();
  18.             }
  19.             byte[] decoded = pemObject.getContent();
  20.             CertificateFactory cf =
  21.                     CertificateFactory.getInstance("X.509", "BC");
  22.             InputStream inputStream = new ByteArrayInputStream(decoded);
  23.             Certificate certificate = cf.generateCertificate(inputStream);
  24.             publicKey = certificate.getPublicKey();


  25.         } catch (Exception e) {
  26.             e.printStackTrace();
  27.         }

阅读(3477) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~