我需要帮助使用为 Adobe Air 生成的现有 .p12 证书来签署 Android 本机应用程序。几年前,应用程序在 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
or
keytool error: java.io.IOException: Invalid keystore format
取决于我尝试执行的命令。
(1)询问老朋友谷歌并没有带来太多,反而带来更多的挫败感。我确实喜欢它的建议openjdk的jira票 https://bugs.openjdk.java.net/browse/JDK-8175251,我尝试使用 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 文件,如下所述:如何从现有私钥和证书创建 JKS KeyStore 文件 http://xacmlinfo.org/2014/06/13/how-to-keystore-creating-jks-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?
我不确定这个问题有多常见,但欢迎任何可能的帮助。