mse*_*ckz 5 java xml keytool digital-signature pfx
我在使用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()));
Run Code Online (Sandbox Code Playgroud)
这是例外:
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)
Run Code Online (Sandbox Code Playgroud)
真正的问题是代码在java中工作1.8.0_111,但错误显示的任何更高版本.
我发现的另一个问题是当我使用以下命令运行此命令keytool:
keytool -list -keystore file.pfx -storepass password -storetype PKCS12 -v
Run Code Online (Sandbox Code Playgroud)
要显示PFX文件的详细信息,那么它只能用于java 1.8.0_111.否则我得到这个例外:
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)
Run Code Online (Sandbox Code Playgroud)
我不知道这是否相关,但这就是我得到的.
有什么想法吗?
PD:抱歉我的英语不好.
这是Java 8u111之后的Java版本中引入的更改.在接下来的版本是Java的8u121.
因此,不再接受基础ASN.1格式的某些编码.
并且在8u121发行说明中提到了这种变化:
security-libs
为DER编码解析代码
添加了更多检查更多检查被添加到DER编码解析代码中以捕获各种编码错误.此外,包含构造的无限长度编码的签名现在将在解析期间导致IOException.请注意,使用JDK默认提供程序生成的签名不受此更改的影响.
JDK-8168714(非公开)
这一具体变化是由于一个漏洞:CVE-2016-5546.
您看到的错误消息(Redundant length bytes found)是作为此更改集的一部分引入的.摘要如下:
8168714: Tighten ECDSA validation
Summary: Added additional checks to DER parsing code
Run Code Online (Sandbox Code Playgroud)
不幸的是截至目前(2018年),变更集"Bug 8168714"中提到的错误仍然是标记为私有的.(如果没有登录,您将无法查看.)
但这里的另一个错误是公众:OpenJDK的:JDK-8175251:无法加载从PKCS12 RSA私钥.(在java.com上也是这个bug的完整版本.)
这个bug链接到上面提到的源代码变更集.
某些P12文件中的编码似乎以某种方式被破坏了.解决方法是使用OpenSSL将P12的内容打包到PEM,然后将它们重新打包成新的P12文件.(真正的解决方案是修复/更新生成P12文件的软件.)
Java Bug票证中提到了以下命令:
Openssl能够在提取私钥时删除冗余0.我们可以使用以下2个命令来规范化受影响的pkcs12文件:
openssl pkcs12 -in pkcs12-file -out key-and-cert -nodes -passin pass:abcXYZ
openssl pkcs12 -in key-and-cert -export -out new-pkcs12-file -passout pass:abcXYZ
更新2018-02-12Mon:我刚刚意识到在Bouncy Castle邮件列表中讨论的问题涉及一种不同类型的编码错误.即:在ASN.1中,您具有TLV(Tag-Length-Value)编码.
Redundant length bytes found.)Invalid encoding: redundant leading 0s.)但是这两个问题都与不必要的(因此非法)填充有关0x00.
Java"Bouncy Castle"加密库的邮件列表中讨论了此更改:
org.bouncycastle.asn1.allow_unsafe_integer).(参见发行说明第2.2.3节.)| 归档时间: |
|
| 查看次数: |
2435 次 |
| 最近记录: |