如何使用多个证书签署APK?

ddc*_*ver 17 android google-play

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

版本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,但似乎我相信Google仍应为那些想要更改其应用程序证书的人提供解决方案.将应用程序更新为使用相同的证书,随着时间的推移创建新的证书,并可能创建一个新证书,以便您可以将应用程序的支持和分发交给其他人.

Chr*_*Orr 14

如果您想多次签署APK,请执行此操作.
但请注意,Google Play不接受具有多个签名的APK.

例如.您可以使用以下命令从命令行对APK进行签名jarsigner:
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,然后在命令行上使用新密钥进行签名,如上所示.

  • 我今天刚刚测试了这个过程 - 看起来市场门户已经更新以检查完整的1-1证书匹配,因此这种证书升级方法不再有效.现在出现错误消息"必须使用与先前版本相同的证书对apk进行签名". (7认同)
  • 似乎工作得很好,这似乎是改变Android Market应用程序上的证书的方法. (2认同)
  • 只是想更新它,它工作正常,但所有用户将必须卸载并重新安装应用程序才能升级.我认为这个问题需要在未来的某个时间由Android市场解决.我不会再更改我的证书了,因为这对我的客户来说是一种烦恼. (2认同)

Jam*_*igh 5

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

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

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

通常,如果攻击者尝试替换某些内容,安装将拒绝,除非删除原始内容 - 此时数据将被擦除。

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

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