Java 密钥库格式无效

Java Invalid keystore format

我有一个 PKCS#8 编码格式的私钥作为 .pem(和 .cert)文件。

如果我尝试调用以下方法:

 private KeyStore getKeyStore() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException{
     String ks = keystores.get(service);
     KeyStore keyStore = KeyStore.getInstance("JKS");
     keyStore.load(new Base64InputStream(new ByteArrayInputStream(ks.getBytes())), "secret".toCharArray());
     return keyStore;
 }

我在第 4 行遇到错误 "keystore.load...":

Caused by: java.io.IOException: Invalid keystore format
at sun.security.provider.JavaKeyStore.engineLoad(Unknown Source) ~[na:1.8.0_211]
at sun.security.provider.JavaKeyStore$JKS.engineLoad(Unknown Source) ~[na:1.8.0_211]
at sun.security.provider.KeyStoreDelegator.engineLoad(Unknown Source) ~[na:1.8.0_211]
at sun.security.provider.JavaKeyStore$DualFormatJKS.engineLoad(Unknown Source) ~[na:1.8.0_211]
at java.security.KeyStore.load(Unknown Source) ~[na:1.8.0_211]
at java_security_KeyStore$load[=12=].call(Unknown Source) ~[na:na]

我该如何解决这个问题?我读到 java 不支持 PKCS#8 编码格式...

如果我尝试像这样手动导入密钥:

keytool -import -alias *alias* -keystore cacerts -file *cert.pem*

我收到这个错误:

keytool error: java.lang.Exception: Input not an X.509 certificate

我尝试在 openssl 中将 pkcs8 转换为 x509(在 windwos 中使用 openvpn)...未成功。

它适用于旧密钥。如果我用新私钥替换旧密钥,那么它会失败..

我该如何解决这个错误?

我的错误:我尝试添加私钥的内容(作为字符串)。 正确方法:

首先使用 openssl(我在 windows 上使用 openvpn)创建一个 PKCS12 文件(将 * * 的内容替换为您的文件路径。):

pkcs12 -inkey *key* -in *cert* -export -out myKeys.pkcs12

仅使用证书(在我的例子中是 .der 文件)。

将您的密钥导入密钥库(.jks 文件):

keytool -importkeystore -srckeystore myKeys.pkcs12 -srcstoretype pkcs12 -destkeystore *keystoreName*

为了使用 .jks 文件的 "content" 初始化字符串,我实现了以下代码:

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.FileUtils;

import java.io.File;

public class ClassName{

    public static void main(String[] args) {
        byte[] bytes = FileUtils.readFileToByteArray(new File("Path to .jks file"));
        String bdata = new String(Base64.encodeBase64(bytes, true));
        System.out.println(bdata);
    }
}

我使用打印的行并用它初始化变量 "ks"(请参阅我在问题中的代码)。