java - org - libreria bouncycastle
Bouncy Castle: PEMReader=> PEMParser (2)
Con un certificado PEM como
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,B9846B5D1803E.....
Usando BC 1.46, extraigo el par de llaves con el siguiente código:
int myFunc(String pemString, char [] password) {
ByteArrayInputStream tube = new ByteArrayInputStream(pemString.getBytes());
Reader fRd = new BufferedReader(new InputStreamReader(tube));
PEMReader pr = new PEMReader(fRd, new Password (password), "BC");
try {
Object o = pr.readObject();
if (o instanceof KeyPair)
.....
Ahora acabo de instalar BC 1.48, y me dicen que PEMReader está en desuso y debe ser reemplazado por PEMParser.
Mi problema es, AFAIK, no hay lugar para una contraseña en PEMParser.
¿Podría alguien darme un ejemplo de cómo migrar mi código a una versión de PEMParser?
Para la versión 1.55 de bcpkix-jdk15on
el código de descifrado cambia a esto:
kp = ((PEMEncryptedKeyPair) object).decryptKeyPair(decryptorProvider);
No comprobé si esto es un error en la respuesta anterior o simplemente una diferencia de API entre las versiones.
Solo necesitaba resolver el mismo problema y no encontré respuesta. Así que pasé un tiempo estudiando BC API y encontré una solución que funciona para mí. Necesitaba leer la clave privada del archivo para que exista el parámetro privateKeyFileName en lugar del parámetro pemString en el método myFunc.
Usando BC 1.48 y PEMParser:
int myFunc(String privateKeyFileName, char [] password) {
File privateKeyFile = new File(privateKeyFileName); // private key file in PEM format
PEMParser pemParser = new PEMParser(new FileReader(privateKeyFile));
Object object = pemParser.readObject();
PEMDecryptorProvider decProv = new JcePEMDecryptorProviderBuilder().build(password);
JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
KeyPair kp;
if (object instanceof PEMEncryptedKeyPair) {
System.out.println("Encrypted key - we will use provided password");
kp = converter.getKeyPair(((PEMEncryptedKeyPair) object).decryptKeyPair(decProv));
} else {
System.out.println("Unencrypted key - no password needed");
kp = converter.getKeyPair((PEMKeyPair) object);
}
}