【发布时间】: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 并使用
deststorepass和destkeypass命令添加两个不同的密码 - 我现在得到的错误是“ UnrecoverableKeyException: 无法恢复密钥"
标签: java eclipse keystore pkcs#12