我正在生成椭圆曲线私钥和公钥。在此之后,我生成证书并使用相同的私钥和证书创建一个 Java 密钥库 (JKS)。我使用了以下命令:
openssl ecparam -name prime256v1 -genkey -noout -out private-key.pem
openssl ec -in private-key.pem -pubout -out public-key.pem
openssl req -new -x509 -key private-key.pem -out cert.pem -days 360
openssl pkcs12 -export -inkey private-key.pem -in cert.pem -name consumer-connector -out vault-filesystem-keystore.p12
keytool -importkeystore -srckeystore vault-filesystem-keystore.p12 -srcstoretype pkcs12 -destkeystore vault-filesystem-keystore.jks
现在,问题是在 Keystore Explorer 中,当我在选择“OpenSSL”作为导出私钥选项后尝试导出私钥时,如下图所示,我导出的私钥不等于一开始生成的私钥
第一个命令生成的私钥是这样的
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEICxNNxwW1iXRv6n6RnlOhxuVCDFrwLrIDtX6qM7CYtXtoAoGCCqGSM49
AwEHoUQDQgAEkYGETlRgz8C6p7MzwOTm+fRULtIGKYj3La3cICqGmVMyXTRl1fi9
HmrmXaxGGQ1Q9sEcHPm+wAnmKLF+KNJ6Ag==
-----END EC PRIVATE KEY-----
但是我使用 Keystore Explorer 从 Java 密钥库导出后得到的私钥是这样的:
-----BEGIN EC PRIVATE KEY-----
MGsCAQEEICxNNxwW1iXRv6n6RnlOhxuVCDFrwLrIDtX6qM7CYtXtoUQDQgAEkYGE
TlRgz8C6p7MzwOTm+fRULtIGKYj3La3cICqGmVMyXTRl1fi9HmrmXaxGGQ1Q9sEc
HPm+wAnmKLF+KNJ6Ag==
-----END EC PRIVATE KEY-----
可以看出,两个键都有一个小的变化。我还在我的 Java 应用程序和我的代码中加载了 java 密钥库的密钥,当我以 PEM 格式从这个 Java 密钥库加载密钥时,我得到了从密钥库资源管理器导出后获得的密钥,它与由于这个实际的密钥我得到异常并且我的应用程序无法解析密钥。我的 Java 代码如下:
public static void loadKeyStore() throws KeyStoreException, CertificateException, IOException, NoSuchAlgorithmException, UnrecoverableEntryException {
KeyStore ks = KeyStore.getInstance("JKS");
InputStream readStream = Main.class.getResourceAsStream("/vault-filesystem-keystore.jks");
ks.load(readStream, "password".toCharArray());
KeyStore.PrivateKeyEntry keyEnt = (KeyStore.PrivateKeyEntry) ks.getEntry("consumer-connector",
new KeyStore.PasswordProtection("password".toCharArray()));
PrivateKey privateKey = keyEnt.getPrivateKey();
ECPrivateKey ecPrivateKey = (ECPrivateKey)privateKey;
var writer = new StringWriter();
try (var jcaPEMWriter = new JcaPEMWriter(writer)) {
jcaPEMWriter.writeObject(ecPrivateKey);
} catch (IOException e) {
}
String privateKeyInPEMFormat = writer.toString();
System.out.println(privateKeyInPEMFormat);
}
我已经花了很多时间来弄清楚这个问题。谁能告诉我如何解决这个问题或我做错了什么?为什么从密钥库导出的私钥不完全等于使用第一个命令生成的实际私钥。