8

バウンシーキャッスルライブラリの新しいバージョンでは、に変更がありますPKCS10CertificationRequest。以前のバージョンでは、メソッドPublicKeyを使用してそのような要求から取得することが可能でした(古いドキュメントを参照)。getPublicKey()

現在、このメソッドは無効になっています。そのようなリクエストからPublicKeyを取得するにはどうすればよいですか?ありますgetSubjectPublicKeyInfo().parsePublicKey()が、戻りますASN1Primitive

SPKACから、をNetscapeCertRequest呼び出すことでPublicKeyを直接読み取ることができることがわかりgetPublicKey()ます。

4

4 に答える 4

12

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);
于 2012-06-14T11:03:35.253 に答える
7

私は同じ問題を見ていましたが、これも機能します(アルゴリズムを指定する必要がないという利点があります)。

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

org.bouncycastle.openssl.jcajce.JcaPEMKeyConverterを参照してください

于 2015-12-28T15:48:11.740 に答える
2

JcaPKCS10CertificationRequestを使用するのはどうですか?

JcaPKCS10CertificationRequest jcaPKCS10CertificationRequest = new JcaPKCS10CertificationRequest(pkcs10CertReq);
PublicKey publicKey = jcaPKCS10CertificationRequest.getPublicKey();
于 2015-04-15T13:43:33.297 に答える
0
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}}、
属性[0]属性{{CRIAttributes}}
}

SubjectPublicKeyInfo {ALGORITHM:IOSet} :: = SEQUENCE{
アルゴリズムAlgorithmIdentifier{{IOSet}}、subjectPublicKey
ビット文字列
}

次に、java.security.spec.X509EncodedKeySpecのドキュメントを見ることができます

SubjectPublicKeyInfo :: = SEQUENCE {
アルゴリズムAlgorithmIdentifier、 subjectPublicKeyビット文字列
}

したがって、この公開鍵のエンコーディングはX.509であることがわかります。次に、それをX509EncodedKeySpecに変更し、keyFactoryによって公開鍵を生成します

于 2017-08-10T07:22:18.737 に答える