Maison >Java >javaDidacticiel >Comment extraire une clé privée RSA d'un fichier codé PEM lorsque je rencontre une « InvalidKeySpecException » ?
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!