Android 生成PKCS10請求(csr)
在做到自簽名的SSL的雙向認證的時候,客戶端需要生成p10請求傳給服務器,服務器簽名之後返回PKCS7證書信息,客戶端使用本地密鑰和PKCS7證書的合成PKCS12證書,就可以進行雙向認證了,這裏記錄下p10證書的生成過程
引入三方jar包
// 這個是加解密相關的包
implementation group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: '1.62'
// 主要用到這個
implementation group: 'org.bouncycastle', name: 'bcpkix-jdk15on', version: '1.62'
完整代碼如下
// 生成KeyPair
public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
// 加密規格爲128/256位 ===> 1024/2048
keyPairGenerator.initialize(2048);
return keyPairGenerator.genKeyPair();
}
// 生成p10證書
public static String generatePKCS10(KeyPair keyPair) throws Exception {
// 證書籤名算法
String sigAlg = "SHA256withRSA";
// 各種基本信息
String params = "CN=CN,OU=Trustmobi,O=client3,L=BJ2";
// CN和公鑰
PKCS10CertificationRequestBuilder p10Builder = new JcaPKCS10CertificationRequestBuilder(
new X500Name(params), keyPair.getPublic());
// 簽名算法
JcaContentSignerBuilder csBuilder = new JcaContentSignerBuilder(sigAlg);
csBuilder.setProvider(new BouncyCastleProvider());
ContentSigner signer = csBuilder.build(keyPair.getPrivate());
// 生成PKCS10的二進制編碼格式(ber/der)
PKCS10CertificationRequest p10 = p10Builder.build(signer);
//將二進制格式轉換爲證書格式(csr)
PemObject pemObject = new PemObject("CERTIFICATE REQUEST", p10.getEncoded());
StringWriter str = new StringWriter();
JcaPEMWriter jcaPEMWriter = new JcaPEMWriter(str);
jcaPEMWriter.writeObject(pemObject);
jcaPEMWriter.close();
str.close();
// base64便於網絡傳輸
return Base64.encode(str.toString());
}