首页 > 解决方案 > 使用 Adob​​e Air 证书签署 Android Native apk

问题描述

我需要使用为 Adob​​e Air 生成的现有 .p12 证书签署 Android Native 应用程序的帮助。应用程序是几年前在 Adob​​e Air 中完成的,签名并发布到 Google play。现在从 Adob​​e 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)问老朋友谷歌并没有带来太多,反而更多的是挫败感。我确实喜欢openjdk 的 jira ticket 中的建议,我尝试使用 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 文件 嗯,它的工作方式是创建我的新 .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?

我不确定这个问题有多普遍,但任何可能的帮助都更受欢迎。

标签: javaandroidsslaircertificate

解决方案


我终于设法找到了解决我面临的这个问题的最佳方法。实际上,解决方案就在我面前,只需付出一点努力。

我尝试切换到 java 1.6 版本只是为了对应用程序进行签名,实际上我确实设法进行了签名。之后我会再次将应用程序转移到 1.8 java 环境并成功完成 zipalign!当我完成这一切时,我真的很高兴,希望 Google Play 最终会接受这个 apk。我将apk上传到商店后,我的希望就破灭了。Google Play 表示并非所有文件都已签名,我需要上传所有已签名文件的 apk。你能想象沮丧的程度吗?

我的问题是我有旧的 .p12 证书,无法在 AndroidStudio 中读取或转换为 jks,但我能够从该文件中提取我的私钥和证书。

在我尝试环顾四周后,我设法使用apksigner tool找到了解决方案。

实际上我所做的是,我构建了一个使用调试密钥签名的 .apk,然后使用 apksigner 工具,提供了我的私钥和证书文件,最后对 apk 进行了签名。然后我可以毫无问题地将 apk 上传到 Google Play 商店。

我使用 apksigner 工具对 apk 进行签名的命令是:

./apksigner sign --key <your_private_key_in_.pcks8> --cert <your_certificate_in.der> <your_debug_signed_application_in.apk>

这里有必要注意您的密钥必须是 .pcks8 格式,否则该命令将不起作用。此外,apksigner 在 linux 上作为脚本运行,这就是为什么在 apksigner 之前使用“./”。如果您在 Windows 上拥有此工具或以其他方式安装此工具,则最好仅使用 apksigner.exe 或 apksigner 启动命令。

如果您的密钥是纯文本 (.pem) 格式,则可以使用 openssl 命令将其转换为 .pcs8 格式:

openssl pkcs8 -topk8 -inform PEM -outform DER -in <your_private_key_in.pem> -out <your_private_key_in.pcks8> -nocrypt

推荐阅读