Java keytool:将 PKCS12 导入 jks 时,出现错误 keystore 密码不正确

Sai*_*uli 7 java openssl keytool pkcs#12

我使用私钥创建了 PKCS12 文件,并使用 openssl 创建了公共证书。我正在尝试导入 PCKS12,但收到错误密钥库密码是正确的。我在命令行参数中添加了密码,如下所示:

openssl pkcs12 -export -in myCert.cer -inkey privatekey.key -out pkcs12.p12 -name somename -password pass:someSecret2022
Run Code Online (Sandbox Code Playgroud)

然后我使用以下 keytool 命令:

keytool -importkeystore -srckeystore pkcs12.p12 -srcstoretype pkcs12 -destkeystore some.jks -deststoretype jks -srcstorepass someSecret2022 -deststorepass changeit
Run Code Online (Sandbox Code Playgroud)

我不断收到错误

keytool error: java.io.IOException: keystore password was incorrect
Run Code Online (Sandbox Code Playgroud)

最重要的是,我使用相同的pcks12.p12文件在 Windows 中导入,它接受上述密码。

我使用的是 zulu 8 java 版本1.8.0_322和 openssl 版本 3.0.3。

感谢您的帮助。

dav*_*085 11

在 KeyStore 加载上复制“java.io.IOException:密钥库密码不正确”(我没有完全回答)。OpenSSL 3.0.x 默认使用用于 PKCS12 的 PBKDF2 和 HmacSHA256(早期的 OpenSSL 没有),并且在某些Java 版本中,标准提供程序错误地处理了此方案,导致它无法解密加密的密钥和证书;请参阅https://bugs.openjdk.java.net/browse/JDK-8278989。选项:

  1. 使用 OpenSSL 1.1.x(或更低版本,但不受支持)创建

  2. 使用 OpenSSL 3.0.x 指定(改进)-legacy和可选-descert- 或者更详细(更正),-certpbe x -keypbe x -macalg sha1其中 x 是非 PBKDF2 算法之一,例如pbeWithSHA1And3-KeyTripleDES-CBC或更容易键入的别名PBE-SHA1-3DES(我不确定 -macalg 是总是需要的,如果愿意的话可以尝试省略)

  3. 使用 Java 11.0.12 或更高版本,或者在 8 中使用奇数Oracle版本 (301,311,321,333),而不是偶数 OpenJDK 版本 (302,312,322)

  4. 在任何 Java 中,请使用https://www.BouncyCastle.org提供程序,优先级高于Oracle 提供程序

  5. 使用 OpenSSL 3.0.x 以外的其他内容(重新)编写 PKCS12;例如,在我的 Windows 10 Home 上,如果我导入到 Windows(正如您所指出的),然后使用默认设置 Encryption=TripleDES-SHA1(不选择 AES128-SHA256)从 Windows 导出,结果在受影响的 Java 版本中是可读的。我想这也适用于 Windows 11。几乎可以肯定还有其他方法。

  6. 使用 keytool 以外的工具来读入 JKS。你可以编写自己的代码(StackOverflow 上有很多关于这一点的问题),或者有许多现有的程序是由有同样需求的不同人创建的。我喜欢https://keystore-explorer.org,因为它打包方便并且具有漂亮的 GUI。