当前位置: 首页 > 知识库问答 >
问题:

迁移Android应用程序版本的密钥库(通过两次签名?)

申屠英韶
2023-03-14

从我所了解到的情况来看,我们应该可以使用jarsigner用两个不同的密钥库对apk文件的第一次更新进行两次签名。那么在未来,任何更新都可以用任何一个键完成,让客户端完全接管应用程序的维护。

Version         Keystore
1.0             A
2.0             A & B
3.0                 B
4.0                 B
...              ...

我希望客户端能够使用ADT导出与密钥存储库B签名的2.0版apk文件。当我们尝试让他们的apk文件包含映射到密钥存储库B的cert.sf,而1.0版的cert.sf映射到密钥存储库A时。

当我尝试此操作时,仍然会出现错误:

An existing package by the same name with a conflicting signature is already installed.

我注意到,当一个apk被导出时,它的META-INF目录中包含了cert.sf。当我像这样用jarsigner签第二次的时候...

jarsigner -keystore /path/to/keystore_b -storepass STOREPASS -keypass KEYPASS ./AndroidApp.apk ALIAS

...元INF现在也包含alias.sf。

这次Android升级是不是因为.sf文件在抱怨?cert.sf被映射到两个不同的键,尽管alias.sf确实包含它要查找的键。

(吸取的教训:尽早为客户端创建新的密钥库)

共有1个答案

空夕
2023-03-14

根据我所了解的情况,我们应该可以使用jarsigner使用两个不同的密钥库对apk文件的第一次更新进行两次签名

对,但所有签名都需要匹配。

那么在未来,任何更新都可以用任何一个键完成,让客户端完全接管应用程序的维护。

不,因为所有的签名都需要匹配。这是Android需要的改变。在您的示例中,2.0版本将失败,因为原始应用程序没有用B签名,尽管它用A签名。

经验教训:尽早为客户端创建新的密钥库

顾问,或者其他为他人创建应用程序的人,可能应该考虑每个应用程序的密钥库方法,或者至少按照您的建议,每个客户端的密钥库。

 类似资料:
  • 如果读者的版本控制工具在前面的迁移方案没有涉及到,也不要紧,因为很可能通过搜索引擎就能找到一款合适的迁移工具。如果找不到相应的工具,可能是您使用的版本控制工具太冷门,或者是一款不提供迁移接口的商业版本控制工具。这时您可以通过手工检入的方式或者针对Git提供的版本库导入接口git fast-import实现版本库导入。 手工检入的方式适合于只有少数几个提交或者对大部分提交历史不关心而只需要对少数里程

  • 我有一个现有的密钥库,里面有一个密码,还有几个不同密码的密钥,供我导出并上传到Google Play的不同应用程序使用。 现在,我最近导入了一个应用程序的项目,对它做了一些重大的修改,我正在尝试使用相同的密钥库和选择相同的别名/密码来导出它,就像我最初创建它时一样。 问题是,在我选择密钥别名并输入密钥密码的步骤之后,我看到“错误:无法恢复密钥”。 我怀疑我可能输入了一个错误的密钥密码(注意密钥库密

  • 我想发出https请求。 我使用bouncyCastle生成密钥库,如下所示: 并且keylist命令返回正确的值。 但是当我这么做的时候: 我有一个错误: 我尝试使用几个版本的bouncycast,但结果是一样的。我还尝试定义keysize 1024,但没有任何更改。 有什么想法吗?

  • 在Google Play控制台中,您可以上传加密的应用程序签名密钥,将现有应用程序转换为使用Google managed应用程序签名:https://support.Google.com/googleplay/android-developer/answer/9842756?hl=en#zippy=%2Cexisting-apps 提供了3种不同的方法,它们都产生相同的加密密钥,但从不同类型的输入

  • 我计划在key vault上保留密钥,但我不清楚密钥和秘密的版本控制,我有一些关于Azure key vault上的key/Secret的版本控制的问题。 如何创建现有密钥的新版本? 是否可以解密用不同版本的相同密钥加密的数据? 是否可以为某个版本的密钥设置过期日期?