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"(请参阅我在问题中的代码)。
我有一个 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"(请参阅我在问题中的代码)。