Java生成SM2证书基于BouncyCastle(cer)

Java生成SM2证书基于BouncyCastle(cer)

可以先加QQ 783021975 咨询相关问题。

自己研究那就是看BC源码。不愿意看就看别的大佬的开源代码

 

https://github.com/ZZMarquis/gmhelper

【SM2证书】利用BC的X509v3CertificateBuilder组装X509国密证书

SM2、SM4加解密 SM2 SM3 签名验签代码部分开源在gitee&github

https://github.com/xiaoshuaishuai319/algorithmNation

https://gitee.com/xshuai/algorithmNation

整理中。完全是Java代码调用BouncCastle生成的哦。先来个图看下 签名算法  和  公钥参数都是 符合SM2算法的

2018年6月22日更新:CRL分布点,添加证书策略,颁发者密钥标识,使用者密钥标识,密钥用法,增强密钥用法,基本约束

可以先加QQ 783021975 咨询相关问题。

2017年8月17日10:37:14 增加生成cer证书代码

 

       /**
     * 国密证书签名算法标识
     */
    private static String  SignAlgor = "1.2.156.10197.1.501";
        /**
	 * 生成国密ROOT证书方法
	 * @param pageCert.getCn()+","+
	 * @throws Exception
	 */
	public static void genSM2CertByRoot() throws Exception {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		org.bouncycastle.jce.provider.BouncyCastleProvider bouncyCastleProvider = new org.bouncycastle.jce.provider.BouncyCastleProvider();
		Security.addProvider(bouncyCastleProvider);
		//证书的名称
                String fileName = "root"+new Date().getTime()/1000;
		String path  = "保存的路径";
		String rootCertPath = path+fileName+".cer";
		try {
			KeyPair kp = KeyGenUtil.getKeyPair2SM2(path,fileName);
                        //这块就是生成SM2公私钥对  非免费提供的代码 有需要加QQ:783021975 具体价格:https://pan.baidu.com/s/1OhC2G944fzkWAzU5RyEM6A
			System.out.println("=====公钥算法====="+kp.getPublic().getAlgorithm());
			BCECPrivateKey bcecPrivateKey = (BCECPrivateKey) kp.getPrivate();//使用ECPrivateKey  PrivateKey都可以
			BCECPublicKey bcecPublicKey = (BCECPublicKey) kp.getPublic();//使用ECPublicKey  PublicKey都可以
			//申请服务器证书信息  我是通过网页得到传递的参数 。如果测试 写死即可。这一步没有什么的。
			X500Principal principal = new X500Principal("CN=小帅丶博客,O=小帅丶博客");
			//X500Principal principal = new X500Principal("CN="+pageCert.getCn()+",O="+pageCert.getO());
			X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();
			certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis()));
			certGen.setIssuerDN(principal);certGen.setNotBefore(new Date());
			certGen.setNotAfter(CertAuthAssist.getYearLater(5));
			certGen.setSubjectDN(principal);
			certGen.setSignatureAlgorithm(SignAlgor);
			certGen.setPublicKey(bcecPublicKey);    
                        //添加CRL分布点 QQ:783021975
                        certGen.addExtension(Extension.cRLDistributionPoints, true, XSCertExtension.getCRLDIstPoint());
                        //添加证书策略 QQ:783021975
                        certGen.addExtension(Extension.certificatePolicies, true, new DERSequence(XSCertExtension.getPolicyInfo()));
                        //颁发者密钥标识
                        DigestCalculator calculator = new BcDigestCalculatorProvider().get(new AlgorithmIdentifier(OIWObjectIdentifiers.idSHA1));
                        X509ExtensionUtils extensionUtils = new X509ExtensionUtils(calculator );
                        certGen.addExtension(Extension.authorityKeyIdentifier, false, extensionUtils.createAuthorityKeyIdentifier(publicKeyInfo));
                        //使用者密钥标识
                        certGen.addExtension(Extension.subjectKeyIdentifier, false,extensionUtils.createSubjectKeyIdentifier(publicKeyInfo));
                        //密钥用法 QQ:783021975
                        certGen.addExtension(Extension.keyUsage,true,XSCertExtension.getKeyUsage());
                        //增强密钥用法 QQ:783021975
                        certGen.addExtension(Extension.extendedKeyUsage,true,XSCertExtension.getExtendKeyUsage());
                        //基本约束
                        BasicConstraints basicConstraints = new BasicConstraints(0);
                        certGen.addExtension(Extension.basicConstraints, true, basicConstraints);
			X509Certificate rootCert = certGen.generateX509Certificate(bcecPrivateKey, "BC");
			FileOutputStream outputStream = new FileOutputStream(rootCertPath);
			outputStream.write(rootCert.getEncoded());outputStream.close();
			} catch (Exception e) {
				logger.info("======根证书申请失败"+e.getMessage());return null;
		}
}

源代码目前非免费提供。如有需要加QQ:783021975

需要用到的BC包

<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on -->
		 <dependency>
		    <groupId>org.bouncycastle</groupId>
		    <artifactId>bcpkix-jdk15on</artifactId>
		    <version>1.57</version>
		</dependency> 
		<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcmail-jdk16 -->
		<dependency>
		    <groupId>org.bouncycastle</groupId>
		    <artifactId>bcmail-jdk15on</artifactId>
		    <version>1.56</version>
		</dependency>

本项目支持 

 

 

 

 

 

 

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
使用Java生成SM2国密算法CER格式公钥的步骤如下: 1. 生成SM2密钥对,包括私钥和公钥。可以使用Bouncy Castle提供的SM2密钥对生成API,代码如下: ``` Security.addProvider(new BouncyCastleProvider()); KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC"); keyPairGenerator.initialize(new SM2ParameterSpec()); KeyPair keyPair = keyPairGenerator.generateKeyPair(); PublicKey publicKey = keyPair.getPublic(); ``` 2. 将公钥转换成CER格式。具体操作如下: a. 将公钥按照ASN.1格式编码,编码规则为DER。 ``` byte[] publicKeyBytes = publicKey.getEncoded(); ``` b. 将编码后的ASN.1格式公钥进行Base64编码,得到最终的CER格式公钥。 ``` byte[] cerBytes = Base64.getEncoder().encode(publicKeyBytes); ``` c. CER格式公钥的开头和结尾会加上"-----BEGIN CERTIFICATE-----"和"-----END CERTIFICATE-----"的标识,需要加上这两行标识才能形成完整的CER格式公钥。 ``` String cerString = "-----BEGIN CERTIFICATE-----\n" + new String(cerBytes) + "\n-----END CERTIFICATE-----"; ``` 这样就可以生成SM2国密算法CER格式公钥。完整的代码如下: ``` Security.addProvider(new BouncyCastleProvider()); KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC"); keyPairGenerator.initialize(new SM2ParameterSpec()); KeyPair keyPair = keyPairGenerator.generateKeyPair(); PublicKey publicKey = keyPair.getPublic(); byte[] publicKeyBytes = publicKey.getEncoded(); byte[] cerBytes = Base64.getEncoder().encode(publicKeyBytes); String cerString = "-----BEGIN CERTIFICATE-----\n" + new String(cerBytes) + "\n-----END CERTIFICATE-----"; System.out.println(cerString); ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小帅丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值