gpt4 book ai didi

Java - 获取 key 失败 : java. security.InvalidKeyException : Invalid RSA private key and DerInputStream. getLength():发现冗余长度字节

转载 作者:数据小太阳 更新时间:2023-10-29 01:54:47 26 4
gpt4 key购买 nike

我在使用 PFX 文件进行 XML 数字签名时遇到了一些问题。运行此代码时出现异常:

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

fs = new FileInputStream(file);

ks.load(fs, "password".toCharArray());

// this line!
KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry("alias", new KeyStore.PasswordProtection("password".toCharArray()));

这是异常(exception)情况:

java.security.UnrecoverableKeyException: Get Key failed: 
java.security.InvalidKeyException: Invalid RSA private key
at sun.security.pkcs12.PKCS12KeyStore.engineGetKey(PKCS12KeyStore.java:435)
at sun.security.pkcs12.PKCS12KeyStore.engineGetEntry(PKCS12KeyStore.java:1306)
at java.security.KeyStore.getEntry(KeyStore.java:1521)
at app.ubl.xml.GenerateSignature.makeSignatureXML(GenerateSignature.java:88)

Caused by: java.io.IOException: DerInputStream.getLength(): Redundant length bytes found
at sun.security.util.DerInputStream.getLength(DerInputStream.java:606)
at sun.security.util.DerInputStream.getLength(DerInputStream.java:569)
at sun.security.util.DerInputStream.getPositiveBigInteger(DerInputStream.java:220)
at sun.security.rsa.RSAPrivateCrtKeyImpl.parseKeyBits(RSAPrivateCrtKeyImpl.java:205)

真正的问题是代码在 java 1.8.0_111 中工作,但错误显示任何更高版本。

运行keytool时出现异常

我发现的另一个问题是,当我使用 keytool 运行此命令时:

keytool -list -keystore file.pfx -storepass password -storetype PKCS12 -v

再次显示 PFX 文件的详细信息,它仅适用于 java 1.8.0_111。否则我会得到这个异常(exception):

java.util.IllegalFormatConversionException: d != java.lang.String
at java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:4302)
at java.util.Formatter$FormatSpecifier.printInteger(Formatter.java:2793)
at java.util.Formatter$FormatSpecifier.print(Formatter.java:2747)
at java.util.Formatter.format(Formatter.java:2520)
at java.util.Formatter.format(Formatter.java:2455)
at java.lang.String.format(String.java:2940)
at sun.security.tools.keytool.Main.withWeak(Main.java:3076)
at sun.security.tools.keytool.Main.printX509Cert(Main.java:3125)
at sun.security.tools.keytool.Main.doPrintEntry(Main.java:1924)
at sun.security.tools.keytool.Main.doPrintEntries(Main.java:2236)
at sun.security.tools.keytool.Main.doCommands(Main.java:1123)
at sun.security.tools.keytool.Main.run(Main.java:366)
at sun.security.tools.keytool.Main.main(Main.java:359)

我不知道这是否相关,但这就是我得到的。

有什么想法吗?

PD:抱歉我的英语不好。

最佳答案

8u121 中更严格的 DER 检查

这是在 Java 8u111 之后的 Java 版本中引入的更改。 next version was Java 8u121 .

因此,一些底层 ASN.1 格式的编码不再被接受。

8u121 release notes 中提到了此更改因此:

security-libs
More checks added to DER encoding parsing code
More checks are added to the DER encoding parsing code to catch various encoding errors. In addition, signatures which contain constructed indefinite length encoding will now lead to IOException during parsing. Note that signatures generated using JDK default providers are not affected by this change.
JDK-8168714 (not public)

原因:CVE

此特定更改是由于存在漏洞:CVE-2016-5546 .

相关源码改动

您看到的错误消息(发现冗余长度字节)是作为 this changeset 的一部分引入的.总结是这样的:

8168714: Tighten ECDSA validation
Summary: Added additional checks to DER parsing code

不幸的是,截至目前(2018 年),变更集中提到的错误 "Bug 8168714" is STILL marked private . (您将无法在没有登录的情况下查看它。)

但这是另一个公开的错误:OpenJDK: JDK-8175251:Failed to load RSA private key from pkcs12 . (此错误的不太完整的版本也是 on java.com。)

这个错误链接到上面提到的源代码变更集。

解决方法:通过 OpenSSL 清洗机运行以清理 P12 文件

某些 P12 文件中的编码似乎以某种方式被破坏了。解决方法是使用 OpenSSL 将 P12 的内容解包到 PEM,然后将它们重新打包到新的 P12 文件中。 (真正的解决方案是修复/更新生成 P12 文件的软件。)

下面的命令是mentioned in the Java Bug ticket :

Openssl is able to remove the redundant 0s when extracting the private key. We can use the following 2 commands to normalize an affected pkcs12 file:

  1. openssl pkcs12 -in pkcs12-file -out key-and-cert -nodes -passin pass:abcXYZ

  2. openssl pkcs12 -in key-and-cert -export -out new-pkcs12-file -passout pass:abcXYZ

进一步阅读:Bouncy CaSTLe 邮件列表

更新 2018-02-12Mon:我刚刚意识到 Bouncy CaSTLe 邮件列表上讨论的问题涉及不同类型的编码错误。即:在 ASN.1 中,你有 T-L-V(标签长度值)编码。

但这两个问题都与使用 0x00 进行不必要(因此非法)填充有关。

此更改在 Java“Bouncy CaSTLe”加密库的邮件列表中进行了讨论:

相关问题

关于Java - 获取 key 失败 : java. security.InvalidKeyException : Invalid RSA private key and DerInputStream. getLength():发现冗余长度字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46979405/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com