最近项目中需要用到用Java实现生成SM2证书的CSR 也在网上找了很多资料,但是都不怎么理想,经过不懈的努力最终还是攻克了。

 

下面放代码:

public static String genCSR(String subject, String alg, String provider, byte[] pkdata) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchProviderException, SignatureException,
			OperatorCreationException {
		String signalg = "";
		int alglength = 0;
		String keyAlg = "";
                  String hexString;


		if (alg.toUpperCase().equals("RSA1024")) {
			signalg = "SHA1WithRSA";
			alglength = 1024;
			keyAlg = "RSA";
		} else if (alg.toUpperCase().equals("RSA2048")) {
			// signalg = "SHA1WithRSA";
			signalg = "1.2.840.10045.4.1";
			alglength = 2048;
			keyAlg = "RSA";
		} else if (alg.toUpperCase().equals("SM2")) {
			// signalg = "ECDSAWITHSHA1";
			signalg = "SHA256WITHECDSA";
			alglength = 256;
			keyAlg = "EC";
		}
		org.bouncycastle.jce.provider.BouncyCastleProvider bouncyCastleProvider = new org.bouncycastle.jce.provider.BouncyCastleProvider();
		Provider t[] = Security.getProviders();
		Security.addProvider(bouncyCastleProvider);
		Provider t1[] = Security.getProviders();
		KeyPairGenerator keyGen = KeyPairGenerator.getInstance(keyAlg);
		keyGen.initialize(alglength);
		KeyPair kp = keyGen.generateKeyPair();
		// [48, 89, 48, 19, 6, 7, 42, -122, 72, -50, 61, 2, 1, 6, 8, 42, -122,
		// 72, -50, 61, 3, 1, 7, 3, 66]
		byte[] heradByte = new byte[] { 48, 89, 48, 19, 6, 7, 42, -122, 72, -50, 61, 2, 1, 6, 8, 42, -122, 72, -50, 61, 3, 1, 7, 3, 66, 0, 4 };
		byte[] data = byteMerger(heradByte, pkdata);
		PKCS10CertificationRequestBuilder builder = new PKCS10CertificationRequestBuilder(new X500Name(subject), SubjectPublicKeyInfo.getInstance(data));
		JcaContentSignerBuilder jcaContentSignerBuilder = new JcaContentSignerBuilder(signalg);
		// jcaContentSignerBuilder.setProvider("BC");
		ContentSigner contentSigner = jcaContentSignerBuilder.build(kp.getPrivate());
		PKCS10CertificationRequest Request = builder.build(contentSigner);
		try {
			byte[] encoded2 = Request.getEncoded();
			hexString = new String(Base64.encode(encoded2));
			System.out.println(hexString);
		} catch (IOException e) {
			e.printStackTrace();
		}

		return hexString;
	}

测试参数:

try {
   String dn = "CN=dfg, OU=aert, O=45y, L=sdfg, ST=fg, C=CN";
   try {
    String pkStr = "AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAv/pInHHFzGAdhIRGDKOc2bjq9I3SUGIOIcMRwgMSpqEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIWXe67pEetAHBkEPY2Mi5B1TLu0+fH0z5gosfV21aUO";
    byte[] pkdata = Base64.decode(pkStr);
    byte[] x = new byte[32];
    byte[] y = new byte[32];
    System.arraycopy(pkdata, 36, x, 0, 32);
    System.arraycopy(pkdata, 36 + 32 + 32, y, 0, 32);
    byte[] data = byteMerger(x, y);
    genCSR(dn, "SM2", "CA", data);
   } catch (OperatorCreationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  } catch (InvalidKeyException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (NoSuchAlgorithmException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (NoSuchProviderException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (SignatureException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

需要的用的库有:bcmail-jdk15on-1.49.jar,bcpg-jdk15on-152.jar,bcpkix-jdk15on-152.jar,bcpkix-jdk15on-152.jar,bcprov-jdk15on-150.jar

  • xiaopeiiiiiii

    请问 heradByte 这个是什么?UID吗

  • feng

    博主你好,请问一下,你的测试方法, String pkStr 是什么?

  • GM

    算法标识用SHA256WITHECDSA而不是SM3WITHSM2生成的证书不会有影响吗?

  • Java生成SM2证书的示例代码有吗?

  • 找到了。public static byte[] byteMerger(byte[] byte_1, byte[] byte_2) {
                byte[] byte_3 = new byte[byte_1.length + byte_2.length];
                System.arraycopy(byte_1, 0, byte_3, 0, byte_1.length);
                System.arraycopy(byte_2, 0, byte_3, byte_1.length, byte_2.length);
                return byte_3;
            }

  • byteMerger是做了什么处理?

  • 你好

    博主,额,不好意思能问下,你签名前部分是用杂凑值加公匙的x,为什么验签的时候用的是ECPoint x1y1 里的X呢

  • 你好

    博主,你好用AsymmetricCipherKeyPair生成的密匙对,密匙对中公匙转为byte数组之后会带有符号位变成65位,然后验签就会失败.

    • @你好:前面一个字节是站位的,国密要求是这样的,你可以去掉的,把第一个字节

  • LSSA

    博主你好,请问可以把你的这篇博文 “java 实现sm2 验签签名,加密解密”和相关的jar包发到我的邮箱吗?谢谢了!

    • @LSSA:去我I的github上看吧https://github.com/a956959099/SM2

    
    
    	
    色迷迷 哭 呕吐 大笑 口水 微笑 啵一个 发怒

    Hi,您需要填写昵称和邮箱!

    • 必填项
    • 必填项