电子应用程序的代码签名 - 如何优雅地切换证书?

8
我有一个 Electron 应用程序,最初使用个人开发者证书进行分发。
现在我想用我的组织证书签署该应用程序的下一个更新,但这样做会导致现有安装(在自动更新时)抛出错误,指出代码要求未满足。
是否有一种方法可以同时使用旧和新证书正确地签署 Electron 应用程序?我希望防止我的现有用户受到干扰。
感谢任何帮助!

你是如何解决这个问题的? - Ajey
1个回答

10
我们曾经遇到过类似的情况,使用自动更新的Electron应用程序在MacOS上,并且我们需要切换到新的证书,而不需要让每个人都手动下载和重新安装应用程序。自动更新过程需要识别新证书。如果未识别到新证书,则旧版本将拒绝更新,这是正确的做法。
我们的策略是:
- 使用 `codesign -d -v -r - ` 命令查看旧证书签名时应用程序的“指定要求”(或 DR)。 - 查看使用新证书签名的应用程序的“指定要求”。 - 将包含两个证书的组合“指定要求”放入名为 `electron-builder-requirements.txt` 的文件中。 - 确保组合“指定要求”字符串中不包含“标识符”。 - 在 `electron-builder.yaml` 文件中引用 `electron-builder-requirements.txt`(在 `mac:` 下添加一行,如 `requirements: electron-builder-requirements.txt`)。 - 发布一个使用旧证书签名但包含有关两个证书信息的 DR 的新版本应用程序。 - 等待几乎所有人都在桌面上运行了包含有关 DR 中两个证书提及的版本。 - 更新构建以使用新证书,并删除 `electron-builder-requirements.txt` 文件。 - 发布一个使用新证书签名的新版本应用程序(不需要要求文件,并且它将仅列出自己的证书)。
具有包含有关两个证书信息的 DR 的旧版本应用程序将允许自动更新到使用任一证书的新版本。
我在理解“指定要求”方面发现这篇手动签名代码文档很有帮助。
更新:以下是 `electron-builder-requirements.txt` 文件的示例(出于隐私目的,我已修改了一些字母/数字)。
designated => certificate leaf = H"2323ce6b0XXXXXXXX39f2064be999999997272b1" or anchor apple generic and certificate 1[field.1.2.840.199995.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.199995.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = "6ZXXXXXXUY"

1
非常感谢您的回答!您是否有 electron-builder-requirements.txt 文件的示例?我在获取确切的语法或组合要求方面遇到了一些困难。 - Misha Reyzlin
1
@MishaReyzlin 我已经编辑了答案,包括 electron-builder-requirements.txt 文件的示例。祝你好运,希望你能让它工作! - Van Boughner
1
你能解释一下你是怎么做到的吗:将包括两个证书在内的合并指定要求放入electron-builder-requirements.txt文件中。 有没有什么方法可以获得组合指定要求? - Elmo
1
创建组合指定要求是需要手动完成的步骤。我查看了使用旧证书签名和新证书签名的应用程序的指定要求。我通过使用“或”将两者组合在一起。请参见我上面包含的electron-builder-requirements.txt文件。在“designated =>”之后的所有内容都是组合的指定要求。请注意那里的“or”,它将两个指定要求分开。 - Van Boughner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接