【发布时间】:2018-12-17 10:54:24
【问题描述】:
我在使用为 Adobe Air 生成的现有 .p12 证书签署 Android Native 应用程序方面需要帮助。应用程序是几年前在 Adobe Air 中完成的,签名并发布到 Google play。现在从 Adobe Air 迁移到 Android Native 时,为了将应用程序升级到商店的新版本,需要使用相同的私钥对其进行签名。问题是在较新版本的 java 上无法通过 keytool 打开/读取密钥。尝试读取 .p12 证书将返回:
java.security.cert.CertificateException: Unable to initialize, java.io.IOException: DerInputStream.getLength(): Redundant length bytes found
或
keytool error: java.io.IOException: Invalid keystore format
取决于我尝试执行的命令。
(1) 向老朋友 Google 询问并没有带来什么,反而带来了更多的挫败感。我确实喜欢jira ticket of openjdk 中的建议,我尝试使用 OpenSSL 以这种方式修复冗余字节:
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
此命令将成功执行,但是生成的 SHA1 密钥 (...:F7) 将与原始密钥 (...:E5) 不同!这实际上并不奇怪,因为更改文件的任何部分(如删除冗余字节)将以不同的 SHA 密钥结尾。好的,所以显然这不是一个解决方案。
(2) 接下来我尝试从原始 .p12 证书中提取私钥和证书作为纯文本 (.pem) 文件,以尝试创建新的 .jks文件。所以我设法将我的私钥和我的证书从原始 .p12 证书提取为纯文本。然后使用 keytools 和 openssl 我尝试使用此处提到的原始数据创建新的 .jks 文件: How to Creat JKS KeyStore file from existing private key and certificate 好吧,它的工作方式是创建我的新 .jks 文件,但 SHA1 密钥(再次...:F7)与原始密钥(...:E5)不同。
(3) 我的下一步是在互联网上阅读和查找更多内容。发现一些解决方案表明转换最后一次在 java 1.8.0_111 中工作,并且上面的每个 java 发行版都有同样的问题。所以,让我们安装 java 1.8.0_111 并试一试。当然,它没有奏效。问题保持不变。在 java 1.10 和 Oracle 版本中也试过了,还是不行
(4) 最后一件事,我安装了 java 1.6 并尝试了它,没有问题,它运行良好,我设法读取 .p12 没有问题,转换它到.jks 完全没有问题,就像一个魅力。生成的 SHA1 密钥 (...:E5) 与原始密钥 (...:E5) 相同!!!
但是,问题是我需要使用该证书签名的应用程序是使用 java 1.8 开发的,而 java 1.8 无法读取该证书。所以我在这一点上很沮丧,因为我已经在这个问题上输了几天了。
所以,无法读取,无法重新生成,无法签署应用程序...
所以我的问题是:是否有可能,如果有,如何使用 .p12 证书签署 Android apk?
我不确定这个问题有多普遍,但欢迎任何可能的帮助。
【问题讨论】:
标签: java android ssl air certificate