2012-06-14 15 views
6

En la nueva versión de la biblioteca de Bouncy Castle, hay cambios en PKCS10CertificationRequest. En versiones anteriores, fue posible obtener PublicKey de dicha solicitud utilizando el método getPublicKey() (consulte old doc).¿Cómo obtener PublicKey desde PKCS10CertificationRequest usando la nueva biblioteca Bouncy Castle?

Ahora este método ha desaparecido. ¿Cómo puedo obtener PublicKey desde esa solicitud? Hay getSubjectPublicKeyInfo().parsePublicKey() pero devuelve ASN1Primitive.

Veo eso desde SPKAC NetscapeCertRequest Todavía puedo leer PublicKey directamente llamando al getPublicKey().

Respuesta

11

Hay una clase de utilidad en el paquete del proveedor principal llamada PublicKeyFactory. El método createKey devuelve AsymmetricKeyParameter que se envía al tipo de clave pública que corresponda, p. Se necesitan

Además, para crear un java.security.PublicKey unos pasos más::

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

EDITAR 1

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

Gracias, pero cuando intento lanzarlo obtengo: 'java.lang.ClassCastException: org.bouncycastle.crypto.params.RSAKeyParameters no se puede convertir a java.security .PublicKey' –

+0

Michal Niklas: No, por supuesto que no, quise lanzarlo al tipo apropiado de clave pública de Bouncycastle. Agregaré el código para convertir a la clave pública de Java en un minuto –

+0

¡Funciona ahora! ¡Gracias! –

1

Qué acerca del uso JcaPKCS10CertificationRequest?

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

Edita tu respuesta con una explicación. – gsamaras

4

que estaba buscando al mismo tema, siendo este también (con la ventaja de que no es necesario especificar el algoritmo):

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

Ver 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 :: = SEQUENCE {
versión INTEGER {v1 (0)} (v1, ...),
Nombre tema,
subjectPKInfo SubjectPublicKeyInfo {{}} PKInfoAlgorithms,
atributos [0] Atributos {{} CRIAttributes }
}

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

y luego, se puede ver el documento de java.security.spec.X509EncodedKeySpec

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

para que sepa que la codificación de esta clave pública es X.509.y luego cambiarlo a X509EncodedKeySpec y generar clave pública por keyFactory

+0

el código de James K Polk es convertir la clave a la codificación PKCS # 1 – sjaojya

+0

utilizando JcaPKCS10CertificaciónRequest es una buena idea, el código de amareno – sjaojya

Cuestiones relacionadas