web-dev-qa-db-fra.com

Château gonflable: PEMReader => PEMParser

Avec un certificat PEM comme

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,B9846B5D1803E.....

en utilisant BC 1.46, j'extrais la paire de clés avec le code suivant:

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)
    .....

Maintenant, je viens d'installer BC 1.48, et ils me disent que PEMReader est obsolète et doit être remplacé par PEMParser.

Mon problème est, AFAIK, il n'y a pas de place pour un mot de passe dans PEMParser.

Quelqu'un pourrait-il me donner un exemple de migration de mon code vers une version PEMParser?

20
stackanovist

J'avais juste besoin de résoudre le même problème et je n'ai trouvé aucune réponse. J'ai donc passé un peu de temps à étudier BC API et j'ai trouvé une solution qui fonctionne pour moi. J'avais besoin de lire la clé privée du fichier afin qu'il y ait le paramètre privateKeyFileName à la place du paramètre pemString dans la méthode myFunc.

Utilisation de BC 1.48 et 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);
    }
}
35
xwatch

Pour la version 1.55 de bcpkix-jdk15on le code de déchiffrement se transforme en ceci:

kp = ((PEMEncryptedKeyPair) object).decryptKeyPair(decryptorProvider);

Je n'ai pas vérifié s'il s'agit d'une erreur dans la réponse ci-dessus ou simplement d'une différence d'API entre les versions.

1
jonas