如何使用新的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生成公钥