java-8 - Java 无效的密钥库格式
问题描述
我有一个 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$0.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 文件的“内容”初始化字符串,我实现了以下代码:
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”(请参阅问题中的代码)。
推荐阅读
- python - 编写zip文件python时文件日期的行为
- python - 边缘去除networkx图时如何保留路径
- python - 当 X 是多维时,多项式回归是否有效?
- google-cloud-iot - iot-device-sdk-embedded-c 中的 IOTC_CONNECTION_RESET_BY_PEER_ERROR
- jquery - Jquery 仅适用于双击
- java - Mongo java api忽略嵌套的或/和运算符
- linux - 从命令行中删除 github 中的 ssh 密钥
- javascript - 当类处于活动状态和非活动状态时更改鼠标悬停的背景图像
- algorithm - 我无法理解 Rust 代码的区别
- spring - @EnableWebSecurity 由配置文件处理的调试布尔标志