如何在java中读取.pem文件格式的EC私钥

Posted

技术标签:

【中文标题】如何在java中读取.pem文件格式的EC私钥【英文标题】:How to read EC Private key in java which is in .pem file format 【发布时间】:2018-06-04 02:39:20 【问题描述】:

如何使用 JAVA 读取 .pem 文件中的 EC 私钥。在阅读时,我收到以下异常。

原因:java.security.InvalidKeyException: IOException : version mismatch: (supported: 00, parsed: 01

其实我的。 Pem 文件包含以下结构的私钥。

----开始EC私钥------ ====+====+=== ====+====+=== -----结束EC私钥-----

【问题讨论】:

你能详细说明你的问题吗? Questions seeking debugging help ("why isn't this code working?") must include the desired behavior, a specific problem or error and the shortest code necessary to reproduce it in the question itself. Questions without a clear problem statement are not useful to other readers. 见:How to create a Minimal, Complete, and Verifiable example。 当我尝试使用 java 读取 .pem 格式的 EC 私钥时,出现以下异常。原因是:“ java.security.InvalidKeyException: IOException : version mismatch: (supported : 00, 解析: 01)" 【参考方案1】:

根据请求从 EC PRIVATE KEY (ex key.pem),我成功地将它导入 java.security.KeyStore

    从 PEM 转换私钥 => PKCS#8 DER
    openssl pkcs8 -in key.pem -inform PEM -topk8 -nocrypt -out key-pkcs8.der -outform DER
    加载它(jvm版本java-1.8.0-openjdk-1.8.0.201.b09-2.fc28.x86_64)
 void loadPrivateKey(KeyStore ks, X509Certificate cert)
    File privKeyFile = new File("key-pkcs8.der");
    // read private key DER file
    DataInputStream dis = new DataInputStream(new FileInputStream(privKeyFile));
    byte[] privKeyBytes = new byte[(int)privKeyFile.length()];
    dis.read(privKeyBytes);
    dis.close();

    KeyFactory kf = KeyFactory.getInstance("EC");
    // decode private key
    PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(privKeyBytes);
    PrivateKey privKey = kf.generatePrivate(privSpec);
    ks.setKeyEntry("key-alias", privKey, "password".toCharArray(), new Certificate[] cert);

【讨论】:

您能解释一下为什么我们必须执行第 1 步吗?比如 to 和 from 格式的标准名称是什么?

以上是关于如何在java中读取.pem文件格式的EC私钥的主要内容,如果未能解决你的问题,请参考以下文章

我在文本文件中有私钥。如何生成 .pem 文件或 .cer 文件

如何从 .NET 读取 PEM RSA 私钥

在命令“ansible-playbook”中加密用户私钥文件

如何将 PKCS#8 格式的 PEM 私钥转换为传统格式?

从 PEM BASE64 编码的私钥文件中获取 RSA 私钥

pkcs1与pkcs8格式RSA私钥互相转换