【问题标题】:"Get Key Failed: Given final block not properly padded" when I try loading .p12 certificate in a Java project当我尝试在 Java 项目中加载 .p12 证书时,“获取密钥失败:未正确填充最终块”
【发布时间】:2021-11-16 03:36:29
【问题描述】:

具体来说,代码的相关部分是这样的(大写的词是占位符):

FileInputStream("PATH TO P12 FILE");

 KeyStore keyStore = KeyStore.getInstance( "PKCS12" );

 keyStore.load( file_inputstream, "PASSWORD".toCharArray() );

 Key privatni = keyStore.getKey( "ALIAS", " PASSWORD ".toCharArray() );

 Signature biljeznik = Signature.getInstance( "SHA256withRSA" );

 biljeznik.initSign( ( PrivateKey )privatni );

 biljeznik.update( medjurezultat.getBytes() );

 potpisano = biljeznik.sign();

我 100% 确定密码和别名是正确的。我知道 P12 文件不能像 JKS 密钥库那样有 2 个密码,但如果这是问题,我不确定如何更改代码(唯一的密码写在两个“PASSWORD”占位符下)。

确切的错误信息是这样的:

java.security.UnrecoverableKeyException: Get Key failed: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
    at java.base/sun.security.pkcs12.PKCS12KeyStore.engineGetKey(PKCS12KeyStore.java:450)
    at java.base/sun.security.util.KeyStoreDelegator.engineGetKey(KeyStoreDelegator.java:91)
    at java.base/java.security.KeyStore.getKey(KeyStore.java:1050)
    at primjer.ZastitniKodIzracun.main(ZastitniKodIzracun.java:56)
Caused by: javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
    at java.base/com.sun.crypto.provider.CipherCore.unpad(CipherCore.java:859)
    at java.base/com.sun.crypto.provider.CipherCore.fillOutputBuffer(CipherCore.java:939)
    at java.base/com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:735)
    at java.base/com.sun.crypto.provider.PKCS12PBECipherCore.implDoFinal(PKCS12PBECipherCore.java:424)
    at java.base/com.sun.crypto.provider.PKCS12PBECipherCore$PBEWithSHA1AndDESede.engineDoFinal(PKCS12PBECipherCore.java:456)
    at java.base/javax.crypto.Cipher.doFinal(Cipher.java:2205)
    at java.base/sun.security.pkcs12.PKCS12KeyStore.lambda$engineGetKey$0(PKCS12KeyStore.java:371)
    at java.base/sun.security.pkcs12.PKCS12KeyStore$RetryWithZero.run(PKCS12KeyStore.java:257)
    at java.base/sun.security.pkcs12.PKCS12KeyStore.engineGetKey(PKCS12KeyStore.java:361)
    ... 3 more

非常感谢任何帮助。

【问题讨论】:

  • "我 100% 确定密码和别名是正确的。"如何?您是否使用其他代码验证了密钥库密码,例如使用keytool list 列出密钥库的条目?或者与 OpenSSL 类似的东西?
  • @erickson 我知道,因为我经常使用这些证书,所以我很容易记住密码 - 而且,正如你所建议的,我已经通过在命令提示符中使用 keystore list 来验证它(这也是我的方式检查别名)。
  • 那么它几乎可以肯定是一个与商店密码不同的“钥匙”(入口)密码。 keytool 尝试不创建 如此不同的密码,但其他 Java 代码可以,我不确定 -importkeystore,当然还有非 Java 工具。 keytool list 仅显示证书信息,而不是“打开”又名“解包”私钥(尽管它确实表明它们在类型中的存在),这对于 PKCS12 意味着它解密 certbag 而不是 shroudedkeybag(s)。您的程序确实需要“打开”私钥来进行签名。您是通过什么程序创建此密钥库的?
  • @dave_thompson_085 感谢您的回复,我的想法也开始朝同一个方向发展 - 不幸的是,我不是密钥库的创建者,根据克罗地亚法律,它是为每个业务主题创建的由国家金融机构负责(该项目的目的是生成使公司与税务局信息服务机构进行通信所需的代码)。
  • @dave_thompson_085 如果这意味着什么:我尝试将 .p12 文件转换为 .jks 并使用 deststorepassdestkeypass 命令添加两个不同的密码 - 我现在得到的错误是“ UnrecoverableKeyException: 无法恢复密钥"

标签: java eclipse keystore pkcs#12


【解决方案1】:

这是一个非常愚蠢的错误:

keyStore.load( file_inputstream, "PASSWORD".toCharArray() );
Key privatni = keyStore.getKey( "ALIAS", " PASSWORD ".toCharArray() );

第二个密码中的空格导致错误。应该是:

keyStore.load( file_inputstream, "PASSWORD".toCharArray() );
Key privatni = keyStore.getKey( "ALIAS", "PASSWORD".toCharArray() );

【讨论】:

    猜你喜欢
    • 2019-06-26
    • 2013-12-02
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 2013-12-18
    • 2012-03-03
    相关资源
    最近更新 更多