基于ECC和RSA算法生成PKCS10请求和解析

最近公司有个项目用,需要基于PKCS10证书请求生成证书,然后最近也是找了资料学习了一下,在此记录一下:

1.首先是生成PKCS10证书请求:

RSA:

public static String genCSR()
			throws InvalidKeyException, NoSuchAlgorithmException,
			NoSuchProviderException, SignatureException {
			try 
			{
			Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
			X509Name dn = new X509Name("CN=TEST,O=TEST,L=BJ,C=CN");
                        //定义密钥对生成算法
			KeyPairGenerator keyGen =KeyPairGenerator.getInstance("RSA");
                        //定义加密位数,RSA2048的生成略慢		
                        keyGen.initialize(2048);
			KeyPair kp = keyGen.generateKeyPair();
			PKCS10CertificationRequest p10 = new PKCS10CertificationRequest("SHA1WithRSA", dn, kp.getPublic(),new DERSet(), kp.getPrivate());
			byte[] der = p10.getEncoded();
			String code = "-----BEGIN CERTIFICATE REQUEST-----\n";
			code += new String(Base64.encode(der));
			code += "\n-----END CERTIFICATE REQUEST-----\n";
			CertificationRequestInfo csrinfo = p10.getCertificationRequestInfo();
			return code;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

这里的密钥对可以选择自己生成,如果有条件,也可以用CA产生的密钥对去做。

ECC:

基于ECC算法的证书请求生成和RSA基本一致,有几处需要改一下:

KeyPairGenerator keyGen =KeyPairGenerator.getInstance("ECDSA");
//位数可以自己定义
keyGen.initialize(256);
KeyPair kp = keyGen.generateKeyPair();
PKCS10CertificationRequest p10 = new PKCS10CertificationRequest("SHA256WithECDSA", dn, kp.getPublic(),new DERSet(), kp.getPrivate());

ECC的生成密钥对相对来说比较快,运算量小,而且现在越来越多的国企央企,事业单位和政府机构强推SM2,所以ECC算法以后会用的非常多。

解析PKCS10请求:

-----BEGIN CERTIFICATE REQUEST-----
MIIBNzCB3gIBADB8MQswCQYDVQQGEwJDTjELMAkGA1UECAwCQkoxCzAJBgNVBAcM
AkJKMQ4wDAYDVQQKDAVCYWlkdTELMAkGA1UECwwCS0YxFjAUBgNVBAMMDXd3dy5i
YWlkdS5jb20xHjAcBgkqhkiG9w0BCQEWDzEyMzQ1Njc4QHFxLmNvbTBZMBMGByqG
SM49AgEGCCqGSM49AwEHA0IABKQfJUWoH0DFlD4CPUdbNwsoKhUzxvFLfaqc392O
Yj8UGzm8IpajFmKJHj/qg/82Auwn2tg7kpOiGzlUZTbGJCOgADAKBggqhkjOPQQD
AgNIADBFAiBtJqIJzplw/0vy1cUnB2OFp0SQqVfgWVdMfM4PQhiXGgIhAMS4X0kv
NheKLQPkI3qcmQP7B0Xh8PMKGh2LP+fBtzW9
-----END CERTIFICATE REQUEST-----

上边这个是一个CSR证书请求的格式,P10就是中间那一段,我生成的这个是基于ECC的256位数的P10请求。。

String sb = "";//这里传入P10请求字符串,注意去掉换行符
PKCS10 pkcs10 = new PKCS10(new BASE64Decoder().decodeBuffer(sb));//解析成P10对象		
//获取P10中定义的证书主题	
X500Name attr = pkcs10.getSubjectName();
//获取算法
String alg = pkcs10.getSigAlg();
//获取P10中的公钥,这里获取的是一个公钥结构体,不是一个单纯的公钥(PS:我们C开发说的,需要用C去解析成单纯的公钥,API没有提供方法)
PublicKey publicKey = pkcs10.getSubjectPublicKeyInfo();

另外这里我附上一个超级好用的网址,里边提供了各种关于CSR的工具,生成/解析/验证等等

https://www.chinassl.net/ssltools/index.html

你可能感兴趣的:(Java)