使用 Adob​​e Air 证书签署 Android Native apk

2024-04-22

我需要帮助使用为 Adob​​e Air 生成的现有 .p12 证书来签署 Android 本机应用程序。几年前,应用程序在 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

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?

我不确定这个问题有多常见,但欢迎任何可能的帮助。


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

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

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

在我尝试多看看之后,我设法找到了解决方案apksigner 工具 https://developer.android.com/studio/command-line/apksigner.

实际上我所做的是,我构建了一个使用调试密钥签名的 .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 命令将其转换为 .pkcs8 格式:

openssl pkcs8 -topk8 -inform PEM -outform DER -in <your_private_key_in.pem> -out <your_private_key_in.pcks8> -nocrypt
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Adob​​e Air 证书签署 Android Native apk 的相关文章

随机推荐

  • 为什么抽象方法不能同步?

    我正在读一本来自 CodeRanch 的线程 http www coderanch com t 455033 java programmer SCJP certification abstract synchronized methods
  • 从后面的代码设置文本框的字体

    如何设置a的字体TextBox from a string在后面的代码中 example txtEditor FontFamily Consolas txtEditor FontFamily new FontFamily Consolas
  • Android Listview添加相同的项目

    我正在开发一个 Android 应用程序 并且正在使用 Android ListView 我从网络服务获取数据并将它们填充到数组列表中 它的大小是 37 然后我尝试用 Arraylist 填充列表视图 但它总是得到相同的元素 最后一个 下面
  • 如何使可能挂起的分叉进程超时?

    我正在编写一个 Perl 脚本 它将写入一些输入并将这些输入发送到外部程序 该程序挂起的可能性虽小但非零 我想将其超时 my pid fork if pid gt 0 eval local SIG ALRM sub die TIMEOUT
  • 在任何项目根目录中都找不到入口文件index.ios.js [“/Users/neo/newProjects/F2”]

    实际行为 从头开始启动 React Native 项目时 我没有启动 而是出现红屏和此错误消息 Cannot Find Entry file index ios js in any of the project root Users neo
  • 将ffmpeg安装到虚拟环境中

    我正在尝试安装ffmpeg以便在 OpenAI 上使用它来录制视频 我已经使用它安装了brew install ffmpeg但不知怎的 当我编译我的代码时 我得到了同样的错误 就像我的包无法识别一样virtualenv我工作的地方 Pyth
  • 无法安装 R 包:CMake 错误

    我正在尝试安装factoextra 但我在 CMake 部分遇到了困难 特别是出现如下错误 CMake Error The source directory tmp does not exist 当我尝试安装其依赖项时也是如此 nloptr
  • ruby yaml ypath 和 xpath 一样吗?

    你好 我有一个像这样的 yaml 文件 data date 2004 06 11 description First description date 2008 01 12 description Another descripion 我如
  • Corda 流的任一侧可以存在于单独的 Cordapp 中吗?

    如果一个节点想要在流的一侧执行自己的特定业务逻辑 如何实现 例如 如果一家公司想要调用内部公司 api 来验证传入的交易数据 它可以在流程中执行此操作吗 如果是这样 是否需要通用地编写流程 以便所有使用相同 Cordapp 和流程 的公司调
  • 读取文件内容并查询数据。蟒蛇3.5.1

    我正在尝试查询我保存在的销售记录data txt文件 每行以逗号分隔
  • 使用 R 将 Excel (.xlsx) 工作表打印/保存为 PDF

    我想打印一个Excel文件到一个pdf操作后的文件 对于操作 我使用了 xlsx包工作正常 有一个功能printSetup但我找不到启动打印的功能 有解决办法吗 library xlsx file lt test xlsx wb lt lo
  • 更改包名称

    我打算通过smali reverse 更改包名 当我打开 apktool yml 时 我看到了这个 强制包 ID 127 我尝试过更改它 但它崩溃了 我为什么要这样做 假设您的目标是重命名 apk 的包名称 则用于类的包名称是无关的 apk
  • THREE.js 导入的模型不应用面部纹理

    我正在尝试导入使用 THREEJS 导出器从搅拌机导出的模型 到目前为止 模型已加载并出现在我的场景中 并且正确应用了材质 汽车应为黄色 玻璃应为透明 但它并没有将我的纹理应用到以 tga 形式保存的汽车上 如果我不将纹理包含在模型所在的服
  • 为什么使用工厂而不是“新”?

    我正在看书其中指出 EMF 编程模型强烈鼓励但不要求 使用工厂来创建对象 而不是简单地使用 new 运算符创建 对象 为什么鼓励使用工厂new 您的答案不必是特定于 EMF 的 只要它与 Java 有关即可 您可以阅读 Effective
  • ng-repeat 没有 HTML 元素(这次真的没有任何)

    我想要得到类似的东西 Line 1 br Line 2 br Line 3 br Line 4 br Line 5 br 使用 ng repeat 各行之间不应有任何分隔符 除了 br 这是一个硬编码的简单指令 br HTML p p ap
  • 如何在 Webpack 中正确使用命名空间 Typescript

    我正在使用 webpack 开发一个新项目 这是我第一次尝试使用这个工具 自从 1 年以来 我一直使用 typescript 针对 angularJS 1 5 进行开发 并且从未遇到过与命名空间相关的任何问题 src App Core Ht
  • 在 Win 7 上安装 Python 2.7 32 位:没有注册表项?

    我已从 python org 下载了 Python 2 7 2 Windows x86 32 位 MSI 并将其安装在 64 位 Windows 7 系统上 一切正常 至少命令行解释器启动并运行 但安装过程不会创建任何PythonWindo
  • `fgetc()` 可能返回 `EOF` 的所有原因是什么?

    当然fgetc 回报EOF when 文件结尾 or an 输入错误 occurs 这就是全部吗 这是否意味着没有更多数据可用 FILE inf int ch while ch fgetc inf EOF if feof inf puts
  • Android中AIDL的实时示例和使用?

    我想知道aidl 的实时示例及其使用 我研究了有关此主题的android 开发人员博客 我无法在实时世界中实现这一点 谁能举个例子告诉我 AIDL用于以某种格式共享数据 primitive and parcelable 与其他应用程序 现实
  • 使用 Adob​​e Air 证书签署 Android Native apk

    我需要帮助使用为 Adob e Air 生成的现有 p12 证书来签署 Android 本机应用程序 几年前 应用程序在 Adob e Air 中完成 签名并发布到 Google Play 现在 当从 Adob e Air 迁移到 Andr