17

如何使用多个证书对 APK 进行签名,以便在发布到 Android Market 时执行此操作:

1.0 版 => 用证书 A
签名 2.0 版 => 用证书 A 和 B
签名 3.0 版 => 用证书 B 签名

Android Market 确实给了我一些希望,但我不知道该怎么做,当我使用不同的签名证书上传时,它给了我这样的信息:

“apk 必须使用至少一个与以前版本相同的证书进行签名。”

动机:
我使用 Android 签名工具在市场上发布了一个应用程序,作为 MotoDev Studio for android 的一部分。问题是它自己处理密钥并且没有办法(记录)来获取它们。我想将其更改为使用我可以更好地控制并且即使我不再使用 MotoDev Studio 也可以使用的密钥库和证书。此外,MotoDev Studio 似乎会将您锁定在共享库等新功能之外。

更新 2011 年 5 月 3 日:
他们在更新 MotoDev Studio 时实际上非常快速和迅速,但似乎我相信谷歌仍然应该为那些想要更改其应用程序证书的人提供解决方法。更新应用程序以使所有应用程序都使用相同的证书,随着时间的推移创建新证书,并可能创建一个新证书,以便您可以将应用程序的支持和分发交给其他人。

4

3 回答 3

14

如果您想多次签署一个 APK,就这样做。
但请注意,Google Play 不接受具有多个签名的 APK。

例如。您可以使用如下方式从命令行签署 APKjarsigner
jarsigner -keystore original-keystore my-app-unsigned.apk key-alias别名

然后用第二个键重复这个:
jarsigner -keystore new-signing-keystore my-app-unsigned.apk key-alias

之后不要忘记运行zipalign
zipalign -v 4 my-app-unsigned.apk my-app.apk


我刚刚重新阅读了有关 MotoDev 工作室的部分。在这种情况下,您可以像往常一样首先使用 MotoDev 对 APK 进行签名,然后在命令行上使用您的新密钥进行签名。

于 2010-05-21T16:55:01.617 回答
4

在看到@ddcruver 的评论 (2010-06-05) 和 @cisearns 的评论 (2011-03-01) 之前,我真的很高兴看到这篇文章。

但是,您描述的转换方法实际上存在一个重大的安全问题(如果它按照您的预期工作),如果攻击者可以让您的用户安装他们的东西,那么替换您的应用程序就变得相当简单:

  • 您发布使用证书 A 签名的应用程序。
  • 攻击者获取 apk,另外使用证书 M 对其进行签名,然后分发应用程序。
  • 然后,攻击者可以发布一个用证书 M 签名的恶意应用程序来替换你的应用程序,并访问它可能存储的任何数据。

通常,如果攻击者试图替换某些东西,安装将拒绝,除非原始文件被删除——此时数据被擦除。

另一方面,仍然有几个有效的用于转换密钥/证书的用例:密钥更新、移交给另一个开发人员等。

这可以通过授权从旧密钥转换到新密钥来更安全地完成。请参阅Android 项目中的问题

于 2012-05-12T22:23:28.520 回答
2

我今天遇到了问题,这就是我所做的:

  1. 备份旧的 motodev.keystore 文件
  2. 使用最近的 motodev studio (2.0.1) 更改我的 motodev.keystore 密码(在可以导入密钥库的 motodev 视图中更改它)
  3. 使用与 java 捆绑的 keytool.exe 程序将 motodev 密钥库文件(JCEKS 类型)转换为常规 android 密钥库文件(JKS 类型):

keytool -importkeystore -srckeystore motodev.keystore -srckeystoretype JCEKS -destkeystore android.keystore -destkeystoretype JKS

现在可以在 Google Eclipse 插件中使用 android.keystore 文件将您的应用程序导出到签名的 APK

于 2011-05-27T21:58:36.883 回答