Java 密钥库 - 兼容性 java 8 和 11

Mar*_*nas 11 java keystore

我需要使用 java 11 生成一个 java 密钥库,并且能够在 java 8 和 java 11 中使用它。我使用格式 PKCS12。由于某种原因,当我使用 java 11 中的 keytool 生成它时,java 8 中的 keytool 无法打开它。

使用 java 11 生成

(java 11)$ keytool -genkeypair -keyalg RSA -noprompt -alias key -dname "CN=hostname, OU=XX, O=XX, L=YY, S=CZ, C=CZ" -keystore file.p12 -storepass password -keypass password -deststoretype pkcs12
Run Code Online (Sandbox Code Playgroud)

对于 java 11,密钥库运行良好。但如果我尝试使用 java 8 读取它

(java 8)$ keytool -list -keystore file.p12 
keytool error: java.io.IOException: Invalid keystore format
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?我认为PKCS12是一种标准化格式,应该是通用的。但由于某种原因,它甚至在 java 版本之间也不起作用。

我能够通过使用 switch 将 keytool 切换到传统生成来解决这个问题-J-Dkeystore.pkcs12.legacy

我想更改我的项目以在代码中生成密钥库。就像是:

KeyStore ks = KeyStore.getInstance("pkcs12");
ks.load(null, password);
ks.setKeyEntry(keyAlias, keyPair.getPrivate(), password, certChain);
ks.store(output, password);
Run Code Online (Sandbox Code Playgroud)

但我遇到了同样的问题。如果我在java 11中生成它,那么java 8就无法打开它(在java代码中也不使用keytool)。有没有办法让KeyStore类生成“兼容”格式的密钥库?或者任何其他方式在代码中生成密钥库,因此它是兼容的?

小智 -1

如果您正在使用 Java 8 运行,请按如下所示进行更改

KeyStore ks = KeyStore.getInstance("JKS");