首页 >Java >java教程 >遇到'InvalidKeySpecException”时,如何从 PEM 编码文件中提取 RSA 私钥?

遇到'InvalidKeySpecException”时,如何从 PEM 编码文件中提取 RSA 私钥?

Patricia Arquette
Patricia Arquette原创
2024-11-10 10:28:02766浏览

How do I extract an RSA private key from a PEM encoded file when encountering an

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn