Heim >Java >javaLernprogramm >Wie extrahiere ich einen privaten RSA-Schlüssel aus einer PEM-codierten Datei, wenn eine „InvalidKeySpecException' auftritt?
Extrahieren des privaten RSA-Schlüssels aus einer PEM-codierten Datei
Problem:
Sie haben eine private Schlüsseldatei codiert im PEM BASE64-Format und möchten es in einem externen Kontext verwenden. Beim Versuch, den Schlüssel zu entschlüsseln, treten jedoch Fehler auf.
Codeausschnitt und Fehler:
Ihr Java-Codeausschnitt zum Lesen des privaten Schlüssels und zum Entschlüsseln der BASE64-Daten:
// Code omitted for brevity
Fehler aufgetreten:
InvalidKeySpecException: Inappropriate key specification: DerInputStream.getLength(): lengthTag=127, too big.
Lösung:
Der Fehler weist darauf hin, dass der Schlüssel im PKCS#1-Format vorliegt, was eine andere Handhabung erfordert als das angestrebte PKCS#8-Format Dein Code. Hier ist eine überarbeitete Lösung, die dieses Problem behebt:
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"); }
Dieser aktualisierte Code verarbeitet sowohl die Formate PKCS#8 als auch PKCS#1, sodass Sie den privaten Schlüssel erfolgreich extrahieren und mit der beabsichtigten Verwendung fortfahren können.
Das obige ist der detaillierte Inhalt vonWie extrahiere ich einen privaten RSA-Schlüssel aus einer PEM-codierten Datei, wenn eine „InvalidKeySpecException' auftritt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!