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

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

可以先加QQ 783021975 咨询相关问题。代码后续会更新一部分

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

可以先加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公私钥对  https://zb.oschina.net/service/70e3fdaf699a724b
			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);
			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;
		}
}

https://zb.oschina.net/service/70e3fdaf699a724b 购买链接。自愿购买

CertAuthAssist.getYearLater()方法:

/**
	 * 计算当前时间的N年后
	 * @param later 正整数
	 * @return
	 */
	public static Date getYearLater(int later) {
		Date date = new Date();
		try {
			Calendar calendar = Calendar.getInstance();
			calendar.add(Calendar.YEAR,later);
			date = calendar.getTime();
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		return date;
	}

本项目支持   1.生成RSA算法cer证书 2.SM2算法cer证书。 3.生成根证书。子证书。三级证书 4.字符串公私钥转 公私钥对象 支持SM2算法

需要用到的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>  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小工匠技术圈

【小工匠聊密码学】--消息摘要--HMAC算法

  HMAC是密钥相关的消息认证码,HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。

531
来自专栏三流程序员的挣扎

RxJava 连接操作符

看注释意思是将所有数据按原来的顺序缓存起来,就是不知道观察者什么时候订阅,什么时候解除订阅,所以缓存起来,以后直接用。

1552
来自专栏WindCoder

进击微信小程序-Java版AES/CBC/PKCS7Padding加解密字符串

进击微信小程序,最初找到腾讯云给的解决方案,无奈后端是node.js,而且才一开始配上去还不能用,之后仔细看readme,摸到它开源的Wafer,本来以为找到终...

652
来自专栏三流程序员的挣扎

RxJava 错误处理操作符

在源 Observable 遇到错误时,立即停止源 Observable 的数据发送,并用新的 Observable 对象进行新的数据发送。

1702
来自专栏三流程序员的挣扎

RxJava 创建操作符

内部触发对 Observer 的 onNext 方法的调用,just 中传递的参数将直接在 onNext 方法中接收到,参数的类型要和 Observer 的泛型...

1511
来自专栏ccylovehs

武电实业卡密接口对接经验分享

以往卡密都是电信直接提供txt文件我们这边再导入数据库中,现在电信要求厂家获取卡密必须通过接口调用,此次对接主要用到三个方面知识:

791
来自专栏IT笔记

JAVA版微信小程序用户数据的签名验证和加解密

签名验证和加解密 数据签名校验 为了确保 开放接口 返回用户数据的安全性,微信会对明文数据进行签名。开发者可以根据业务需要对数据包进行签名校验,确保数据的完整性...

5285
来自专栏Java与Android技术栈

Cold Observable 和 Hot Observable

Hot Observable 无论有没有 Subscriber 订阅,事件始终都会发生。当 Hot Observable 有多个订阅者时,Hot Observa...

1052
来自专栏技术博文

PHP的几个常用加密函数

在php的开发过程中,常常需要对部分数据(如用户密码)进行加密 一、加密类型: 1.单向散列加密   就是把任意长度的信息进行散列计算,得到固定长度的输出,这个...

3338
来自专栏androidBlog

Rxjava 2.x 源码系列 - 线程切换 (上)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/de...

1603

扫码关注云+社区