java openssl bouncycastle pem jca

java - ¿Cómo puedo leer un archivo PEM de clave privada BouncyCastle usando JCA?



openssl (1)

La clave dentro del archivo PEM ya está almacenada en formato PKCS # 8, de modo que si no está encriptada con contraseña, puede simplemente eliminar encabezados (----- BEGIN RSA PRIVATE KEY -----), entrada de decodificación Base64, y obtener los bytes necesarios.

Esta pregunta ya tiene una respuesta aquí:

En una de nuestras aplicaciones, las claves privadas se almacenan usando el PEMWriter de BouncyCastle. En este momento estoy investigando si podemos deshacernos de la dependencia de BouncyCastle ya que Java 7 parece tener todo lo que necesitamos. El único problema es que no puedo leer las claves privadas almacenadas en la base de datos como cadenas codificadas en PEM (los certificados / claves públicas son correctos).

Si guardo la cadena codificada en PEM de la clave privada de la base de datos en un archivo, puedo ejecutar OpenSSL para convertir la clave al formato PKCS # 8 de la siguiente manera:

openssl pkcs8 -topk8 -inform PEM -outform DER / -in private_key.pem -out private_key.der -nocrypt

La salida resultante puedo basar64 codificar y luego leer usando este bit de código Java / JCA:

byte[] privateKeyBytes = DatatypeConverter.parseBase64Binary(privateKeyDERcontents); PrivateKey prKey = KeyFactory.getInstance("RSA"). generatePrivate(new PKCS8EncodedKeySpec(privateKeyBytes));

Esta clave privada coincide con la clave pública almacenada como se esperaba, es decir, puedo pasar de texto plano a texto cifrado y viceversa.

La pregunta que tengo es: ¿puedo leer directamente la codificación PEM original de alguna manera?

EDITAR

Aquí hay un poco de código que lee las cadenas en cuestión usando BouncyCastle:

if (Security.getProvider("BC") == null) { Security.addProvider(new BouncyCastleProvider()); } PEMReader pemReader = new PEMReader(new StringReader(privateKeyPEM)); KeyPair keyPair = (KeyPair) pemReader.readObject(); PrivateKey key = keyPair.getPrivate();

El "privateKeyPEM" es la cadena codificada PEM en la base de datos; de lo contrario, este ejemplo es autónomo. Curiosamente, ya utiliza el objeto JCA KeyPair como salida. Para reformular mi pregunta original: ¿puedo hacer el equivalente al código anterior sin depender de PEMReader (y a su vez bastantes otras clases de BouncyCastle)?