【问题标题】:How to sign an APK with more than one certificate?如何使用多个证书签署 APK?
【发布时间】:2011-02-22 08:08:38
【问题描述】:

如何使用多个证书签署 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 时非常迅速和迅速,但我似乎认为 Google 仍应为那些想要的人提供解决方法更改其申请的证书。更新应用程序以使所有应用程序都使用相同的证书,随着时间的推移创建新的,并可能创建一个新的,以便您可以将您的应用程序的支持和分发交给其他人。

【问题讨论】:

    标签: android google-play


    【解决方案1】:

    如果您想对一个 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 进行签名,然后在命令行上使用您的新密钥进行签名。

    【讨论】:

    • 好的,我会看看 Android Market 是否会接受分配了旧证书和新证书的它,然后只用新证书上传另一个更新,看看它是否有效。这就是我的想法,但我对代码签名一般来说是新手,而且它一次也没有提到更改证书的方法。
    • 至少在 Android 文档中。
    • 似乎工作得很好,这似乎是在 Android Market 应用程序上更改证书的方法。
    • 只是想更新它,它工作正常,但您的所有用户都必须卸载并重新安装那里的应用程序才能升级。我认为这个问题需要在未来某个时间由 android 市场解决。我不会再更改我的证书了,因为这对我的客户来说很烦人。
    • 我今天刚刚测试了这个过程 - 看起来市场门户已经更新以检查完整的 1-1 证书匹配,因此这种证书升级方法不再有效。现在的错误消息是“必须使用与以前版本相同的证书对 apk 进行签名。”
    【解决方案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

    【讨论】:

    • 在jdk1.7.0_45中,他们改变了一些参数名称。现在是 srcstorestype 和 deststoretype。
    【解决方案3】:

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

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

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

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

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

    这可以通过授权从旧密钥转换到新密钥来更安全地完成。请查看issue in the Android project

    【讨论】:

    • "攻击者获取apk,附加证书M签名,分发应用。" -- 根据您引用的 cmets,这似乎被开发者控制台阻止了。
    • 是的。就目前而言,这不是安全问题。我的意思是,如果/曾经/有可能以这种方式转换密钥,那么它/将/是一个安全问题。
    • 另请注意,Google Play(和开发者控制台)并不是分发 apk 文件的唯一方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多