从 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中文网其他相关文章!