PEM 인코딩 파일에서 RSA 개인 키 추출
문제:
개인 키 파일이 인코딩되어 있습니다. PEM BASE64 형식이고 외부 컨텍스트에서 사용하려고 합니다. 그러나 키를 디코딩하는 동안 오류가 발생했습니다.
코드 조각 및 오류:
개인 키를 읽고 BASE64 데이터를 디코딩하기 위한 Java 코드 조각:
// Code omitted for brevity
발생한 오류:
InvalidKeySpecException: Inappropriate key specification: DerInputStream.getLength(): lengthTag=127, too big.
해결책:
오류는 키가 PKCS#1 형식임을 나타냅니다. 코드에서 대상으로 지정된 PKCS#8 형식입니다. 다음은 이 문제를 해결하는 수정된 솔루션입니다.
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"); }
이 업데이트된 코드는 PKCS#8 및 PKCS#1 형식을 모두 처리하므로 개인 키를 성공적으로 추출하고 원하는 용도로 사용할 수 있습니다.
위 내용은 'InvalidKeySpecException'이 발생할 때 PEM 인코딩 파일에서 RSA 개인 키를 추출하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!