2012-06-14 12 views
6

Nella nuova versione della libreria di Bouncy Castle ci sono modifiche in PKCS10CertificationRequest. Nelle versioni precedenti era possibile ottenere PublicKey da tale richiesta utilizzando il metodo getPublicKey() (vedere old doc).Come ottenere PublicKey da PKCS10CertificationRequest usando la nuova libreria di Bouncy Castle?

Ora questo metodo è scomparso. Come posso ottenere da questa richiesta PublicKey? C'è getSubjectPublicKeyInfo().parsePublicKey() ma restituisce ASN1Primitive.

Vedo che da SPKAC NetscapeCertRequest Posso ancora leggere PublicKey direttamente chiamando getPublicKey().

risposta

11

Esiste una classe di utilità nel pacchetto del provider principale denominato PublicKeyFactory. Il metodo createKey restituisce un valore AsymmetricKeyParameter che viene trasmesso a qualunque tipo di chiave pubblica appropriato, ad es. Sono necessari

Inoltre, per creare una java.security.PublicKey qualche altro passo::

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

EDIT 1

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

Grazie, ma quando provo a lanciarlo ho ottenuto: 'java.lang.ClassCastException: org.bouncycastle.crypto.params.RSAKeyParameters non può essere lanciato su java.security .PublicKey' –

+0

Michal Niklas: No, certo che no, intendevo scriverlo per il tipo appropriato di chiave pubblica di Bouncycastle. Aggiungerò il codice per convertire in Java la chiave pubblica in un minuto –

+0

Funziona ora! Grazie! –

1

Cosa succede ad usare JcaPKCS10CertificationRequest?

JcaPKCS10CertificationRequest jcaPKCS10CertificationRequest = new JcaPKCS10CertificationRequest(pkcs10CertReq); 
PublicKey publicKey = jcaPKCS10CertificationRequest.getPublicKey(); 
+0

Modifica la tua risposta con la spiegazione. – gsamaras

4

stavo guardando lo stesso problema, e questo funzionerà anche (con il vantaggio che non abbiamo bisogno di specificare l'algoritmo):

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

Vedi org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter

0
PKCS10CertificationRequest csr =...;  
PublicKey pk = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(csr.getSubjectPublicKeyInfo().toASN1Primitive().getEncoded())); 

RFC 2986 - PKCS #10: Certification Request Syntax

CertificationRequestInfo :: = SEQUENZA {
versione INTEGER {v1 (0)} (v1, ...),
soggetto Nome,
subjectPKInfo SubjectPublicKeyInfo {{}} PKInfoAlgorithms,
attributi [0] Attributi {{} CRIAttributes }}

SubjectPublicKeyInfo {aLGORITMO: IOSet} :: = SEQUENZA {
algoritmo AlgorithmIdentifier {{}} IOSet,
subjectPublicKey BIT STRING
}

e poi, si può vedere il documento di java.security.spec.X509EncodedKeySpec

SubjectPublicKeyInfo :: = SEQUENZA {
algoritmo AlgorithmIdentifier,
subjectPublicKey BIT STRING}

così saprai che la codifica di questa chiave pubblica è X.509.e poi cambiarlo in X509EncodedKeySpec e generare la chiave pubblica con keyFactory

+0

il codice di James K Polk è convertire la chiave in codifica PKCS # 1 – sjaojya

+0

utilizzando JcaPKCS10CertificationRequest è una buona idea, il codice di amareno – sjaojya

Problemi correlati