Mengekstrak Kunci Peribadi RSA daripada Fail Dikodkan PEM
Masalah:
Anda mempunyai fail kunci peribadi yang dikodkan dalam format PEM BASE64 dan ingin menggunakannya dalam konteks luaran. Walau bagaimanapun, menghadapi ralat semasa cuba menyahkod kekunci.
Coretan Kod dan Ralat:
Coretan kod Java anda untuk membaca kunci peribadi dan menyahkod data BASE64:
// Code omitted for brevity
Ralat yang dihadapi:
InvalidKeySpecException: Inappropriate key specification: DerInputStream.getLength(): lengthTag=127, too big.
Penyelesaian:
Ralat menunjukkan bahawa kunci berada dalam format PKCS#1, yang memerlukan pengendalian yang berbeza daripada Format PKCS#8 disasarkan dalam kod anda. Berikut ialah penyelesaian yang disemak yang menangani isu ini:
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"); }
Kod yang dikemas kini ini mengendalikan kedua-dua format PKCS#8 dan PKCS#1, membolehkan anda berjaya mengeluarkan kunci persendirian dan meneruskan penggunaan yang anda inginkan.
Atas ialah kandungan terperinci Bagaimanakah cara saya mengekstrak kunci persendirian RSA daripada fail yang dikodkan PEM apabila menemui 'InvalidKeySpecException'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!