Maison >Java >javaDidacticiel >Comment extraire une clé privée RSA d'un fichier codé PEM lorsque je rencontre une « InvalidKeySpecException » ?

Comment extraire une clé privée RSA d'un fichier codé PEM lorsque je rencontre une « InvalidKeySpecException » ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-10 10:28:02809parcourir

How do I extract an RSA private key from a PEM encoded file when encountering an

Extraction de la clé privée RSA d'un fichier encodé PEM

Problème :
Vous avez un fichier de clé privée encodé au format PEM BASE64 et souhaitez l'utiliser dans un contexte externe. Cependant, vous rencontrez des erreurs lors de la tentative de décodage de la clé.

Extrait de code et erreurs :
Votre extrait de code Java pour lire la clé privée et décoder les données BASE64 :

// Code omitted for brevity

Erreurs rencontré :

InvalidKeySpecException: Inappropriate key specification: DerInputStream.getLength(): lengthTag=127, too big.

Solution :

L'erreur indique que la clé est au format PKCS#1, ce qui nécessite une gestion différente de celle du format PKCS#8 ciblé dans votre code. Voici une solution révisée qui résout ce problème :

import sun.security.util.DerInputStream;
import sun.security.util.DerValue;

// Code omitted for brevity

public static PrivateKey pemFileLoadPrivateKeyPkcs1OrPkcs8Encoded(File pemFileName) throws GeneralSecurityException, IOException {
    // PKCS#8 format
    final String PEM_PRIVATE_START = "-----BEGIN PRIVATE KEY-----";
    final String PEM_PRIVATE_END = "-----END PRIVATE KEY-----";

    // PKCS#1 format
    final String PEM_RSA_PRIVATE_START = "-----BEGIN RSA PRIVATE KEY-----";
    final String PEM_RSA_PRIVATE_END = "-----END RSA PRIVATE KEY-----";

    Path path = Paths.get(pemFileName.getAbsolutePath());

    String privateKeyPem = new String(Files.readAllBytes(path));

    if (privateKeyPem.indexOf(PEM_PRIVATE_START) != -1) { // PKCS#8 format
        // Code omitted for brevity
    } else if (privateKeyPem.indexOf(PEM_RSA_PRIVATE_START) != -1) {  // PKCS#1 format
        privateKeyPem = privateKeyPem.replace(PEM_RSA_PRIVATE_START, "").replace(PEM_RSA_PRIVATE_END, "");
        privateKeyPem = privateKeyPem.replaceAll("\s", "");

        DerInputStream derReader = new DerInputStream(Base64.getDecoder().decode(privateKeyPem));

        DerValue[] seq = derReader.getSequence(0);

        // Code omitted for brevity
    }

    throw new GeneralSecurityException("Not supported format of a private key");
}

Ce code mis à jour gère à la fois les formats PKCS#8 et PKCS#1, vous permettant d'extraire avec succès la clé privée et de poursuivre l'utilisation prévue.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn