gpt4 book ai didi

java - InvalidKeySpecException : How do I extract a private key from a . 文件?

转载 作者:行者123 更新时间:2023-12-02 01:43:02 25 4
gpt4 key购买 nike

我有一个 .der 格式的私钥文件。我试图将此私钥保存为 PrivateKey 对象(使用 Java),如下所示:

PrivateKey clientPrivKey = getPrivateKeyFromKeyFile("C:\\Users\\Bob\\Desktop\\Assignments\\Project\\VPN Project\\src\\client-private.der");

这就是 getPrivateKeyFromKeyFile 方法的样子:

private static PrivateKey getPrivateKeyFromKeyFile(String keyfile) throws Exception
{
Path path = Paths.get(keyfile);
byte[] privKeyByteArray = Files.readAllBytes(path);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privKeyByteArray);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey myPrivKey = keyFactory.generatePrivate(keySpec);
return myPrivKey;
}

但是当我尝试这样做时,由于这行代码,我不断收到 InvalidKeySpecException:

PrivateKey myPrivKey = keyFactory.generatePrivate(keySpec);

我不确定这里出了什么问题。我打开私钥文件,一切看起来都很好。它以 -----BEGIN RSA PRIVATE KEY----- 开头,以 -----END RSA PRIVATE KEY----- 结束。

如果相关的话,我使用以下 OpenSSL 命令创建了这个私钥:

genrsa -out client-private.der 2048

最佳答案

生成的文件

openssl genrsa -out <path to output-file> 2048

实际上不是 .der 文件,而是 .pem 文件(例如 What are the differences between .pem, .cer and .der? ),并且数据不存储在 中PKCS8-格式,但采用 PKCS1-格式(参见例如 PKCS#1 and PKCS#8 format for RSA private key )。无法使用标准 Java 工具直接处理 PKCS1 格式的 key 。为此,需要像 BouncyCaSTLe 这样的第三方库(参见 Read RSA private key of format PKCS1 in JAVA )。

另一种可能性是首先使用 OpenSSL 将 PKCS1 格式的 key 转换为 PKCS8 格式的 key (参见例如 Load a RSA private key in Java (algid parse error, not a sequence) ):

openssl pkcs8 -topk8 -inform PEM -outform PEM -in <path to the input-pkcs1-pem-file> -out <path to the output-pkcs8-pem-file> -nocrypt

然后,在(编程)删除开始/结束行之后以及在进行 base64 解码之后,可以生成私钥(参见例如 How to read .pem file to get private and public key ),例如与

private static PrivateKey getPrivateKeyFromKeyFile(String keyfile) throws Exception
{
Path path = Paths.get(keyfile);
byte[] privKeyByteArray = Files.readAllBytes(path);
// added ----------------------------------------------------------------
String privKeyString = new String(privKeyByteArray);
privKeyString = privKeyString.replace("-----BEGIN PRIVATE KEY-----", "");
privKeyString = privKeyString.replace("-----END PRIVATE KEY-----", "");
privKeyString = privKeyString.replace("\r\n", "");
privKeyByteArray = Base64.getDecoder().decode(privKeyString);
// ----------------------------------------------------------------------
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privKeyByteArray);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey myPrivKey = keyFactory.generatePrivate(keySpec);
return myPrivKey;
}

关于java - InvalidKeySpecException : How do I extract a private key from a . 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54168369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com