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

时间:2010-05-21 12:14:27

标签: android google-play

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

版本1.0 =>签署证书A
版本2.0 =>签署证书A&乙
版本3.0 =>签署证书B

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

  

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

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

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

3 个答案:

答案 0 :(得分:14)

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

例如。您可以使用jarsigner从命令行sign an APK,如下所示:
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 :(得分:4)

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

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

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

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

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

通过授权从旧密钥转换到新密钥,可以更安全地完成此操作。请参阅issue in the Android project

答案 2 :(得分:2)

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

  1. 备份旧的motodev.keystore文件
  2. 使用最近的motodev工作室(2.0.1)更改我的motodev.keystore密码(在motodev视图中更改它,您可以导入密钥库)
  3. 使用与java捆绑在一起的keytool.exe程序将motodev密钥库文件(类型为JCEKS)转换为常规的android密钥库文件(类型为JKS):
  4. keytool -importkeystore -srckeystore motodev.keystore -srckeystoretype JCEKS -destkeystore android.keystore -destkeystoretype JKS

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