如何使用新的Bouncy Castle库从PKCS10CertificationRequest获取PublicKey?

在新版本的Bouncy Castle库中, PKCS10CertificationRequest发生了PKCS10CertificationRequest 。 在以前的版本中,可以使用getPublicKey()方法从此类请求获取PublicKey (请参阅旧文档 )。

现在这种方法消失了。 如何通过此类请求获取PublicKey? 有getSubjectPublicKeyInfo().parsePublicKey()但它返回ASN1Primitive

我从SPKAC NetscapeCertRequest看到我仍然可以通过调用getPublicKey()直接读取PublicKey。

主提供程序包中有一个名为PublicKeyFactory的实用程序类。 createKey方法返回一个AsymmetricKeyParameter ,您可以将其转换为适当的任何类型的公钥,例如

 SubjectPublicKeyInfo pkInfo = pkcs10CertReq.getSubjectPublicKeyInfo(); RSAKeyParameters rsa = (RSAKeyParameters) PublicKeyFactory.createKey(pkInfo); 

编辑1:

此外,要创建java.security.PublicKey还需要执行以下几个步骤:

 RSAPublicKeySpec rsaSpec = new RSAPublicKeySpec(rsa.getModulus(), rsa.getExponent()); KeyFactory kf = KeyFactory.getInstance("RSA"); PublicKey rsaPub = kf.generatePublic(rsaSpec); 

我正在研究同样的问题,这也会起作用(我们不需要指定算法的优势):

 SubjectPublicKeyInfo pkInfo = pkcs10CertReq.getSubjectPublicKeyInfo(); JcaPEMKeyConverter converter = new JcaPEMKeyConverter(); PublicKey pubKey = converter.getPublicKey(pkInfo); 

请参阅org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter

那么使用JcaPKCS10CertificationRequest呢?

 JcaPKCS10CertificationRequest jcaPKCS10CertificationRequest = new JcaPKCS10CertificationRequest(pkcs10CertReq); PublicKey publicKey = jcaPKCS10CertificationRequest.getPublicKey(); 
 PKCS10CertificationRequest csr =...; PublicKey pk = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(csr.getSubjectPublicKeyInfo().toASN1Primitive().getEncoded())); 

RFC 2986 – PKCS#10:认证请求语法

CertificationRequestInfo :: = SEQUENCE {
版本INTEGER {v1(0)}(v1,…),
科目名称,
subjectPKInfo SubjectPublicKeyInfo {{PKInfoAlgorithms}},
attributes [0] Attributes {{CRIAttributes}}
}

SubjectPublicKeyInfo {ALGORITHM:IOSet} :: = SEQUENCE {
算法AlgorithmIdentifier {{IOSet}},
subjectPublicKey BIT STRING
}

然后,您可以看到java.security.spec.X509EncodedKeySpec的文档

SubjectPublicKeyInfo :: = SEQUENCE {
算法AlgorithmIdentifier,
subjectPublicKey BIT STRING}

所以你会知道这个公钥的编码是X.509。 然后将其更改为X509EncodedKeySpec并通过keyFactory生成公钥