概览
公证让用户可以更加放心,确信你分发的且用 Developer ID 签名的软件已通过 Apple 的恶意组件检查。公证并不是 App Review 审核。Apple 公证服务是一个自动化系统,它会扫描你的软件中有没有恶意内容,检查有没有代码签名问题,并将结果迅速返回给你。如果没有问题,公证服务会生成一个凭证,供你附加到你的软件上;公证服务还会将该凭证发布到网上,让“门禁”能够找到它。
当用户首次安装或运行你的软件时,“门禁”通过该凭证 (不论是网上还是附加于可执行文件) 可确保该软件已经过 Apple 公证。然后,“门禁”会在初始启动对话框中置入描述信息,让用户能明智地决定是否启动相应的 App。
你可以为多种不同类型的软件交付内容进行公证,包括:
-
macOS App
-
非 App 套装,如内核扩展
-
磁盘映像 (UDIF 格式)
-
扁平化安装器软件包
万一你的 Developer ID 签名密钥遭到泄露,公证也能保护你的用户。公证服务会为使用你的签名密钥分发的软件维护一个审查记录。如果你发现自己软件的未授权版本,则可以与 Apple 合作来撤销与那些版本关联的凭证。
重要信息
自 macOS 10.14.5 开始,用新 Developer ID 证书签名的软件以及所有新的或更新的内核扩展都必须经过公证才能运行。自 macOS 10.15 开始,所有在 2019 年 6 月 1 日后构建并使用 Developer ID 分发的软件都必须经过公证。不过,通过 Mac App Store 分发的软件不需要进行公证,因为 App Store 提交流程中已包含同等的安全性检查。
准备公证你的软件
公证要求使用 Xcode 10 或更高版本。构建需进行公证的新 App 需要使用 macOS 10.13.6 或更高版本。为 App 附加凭证需要 macOS 10.12 或更高版本。
Apple 的公证服务要求你采用以下保护:
-
为你分发的所有可执行文件启用代码签名,并确保可执行文件中包含有效的代码签名,具体如“确保有效的代码签名 (英文)”中所述。
-
使用“Developer ID”app、内核扩展、系统扩展或安装器证书来为你的代码签名。(不要使用 Mac 分发、Ad Hoc、Apple Developer 或本地开发证书。)在提交前验证证书类型,具体如“使用有效的 Developer ID 证书 (英文)”中所述。有关更多信息,请参阅“创建、导出和删除签名证书”。
-
为你的 App 和命令行目标启用强化版运行时功能,具体如“启用强化版运行时”中所述。
-
在代码签名中附上安全时间戳。(Xcode 分发工作流程中默认包含安全时间戳。对于自定工作流程,请参阅“附上安全时间戳 (英文)”。)
-
不要包含值设为
true
.security的任何变化形式的 com .apple .get-task-allow
授权。如果你的软件托管有第三方插件,并且需要此授权来在主机可执行文件环境中调试插件,请参阅“避免 Get-Task-Allow 授权 (英文)”。 -
针对 macOS 10.9 或更高版本的 SDK 进行链接,具体如“使用 macOS 10.9 SDK 或更高版本 (英文)”中所述。
-
确保你的流程使用正确格式化的 XML 和 ASCII 编码的授权,具体如“确保正确格式化的授权 (英文)”。
Apple 建议你对分发的所有软件进行公证,包括旧发行版本,甚至是不满足所有这些要求或没有签名的软件。Apple 的公证服务利用各种各样的方法 (包括遥测) 来确定上述规则中有哪些可以对既有软件放宽要求。有关更多信息,请参阅“对你的既有软件进行公证 (英文)”。
重要信息
一些既有软件可能在成功完成公证后无法正确运行。例如,“门禁”可能发现放宽要求的公证流程未能强制执行的代码签名问题。务必要查看公证日志中有没有任何警告,并在分发前测试你的软件。
对插件进行公证
在 macOS 10.15 及更高版本中,App 可以载入隔离的插件 (从互联网下载或通过“隔空投送”传输),但前提是这些插件要经过公证。如果插件未经公证,用户必须通过打开“系统偏好设置”app,并找到“安全与隐私”中的“通用”标签页来明确批准插件。
添加插件所需的授权
当你根据公证要求启用强化版运行时实施的额外安全性时,这会同时影响你的 App 本身和 App 托管的任何插件。插件不会自己声明授权,而是会继承主机进程的授权。因此,主机 App 必须包含预期插件需要的所有授权,即使这些插件已经另外经过公证也是如此。
例如,如果插件通过 C 函数指针覆盖实施与主机可执行文件的深度集成,或者将 JavaScript 引擎用于自定工作流程,那么主机可执行文件必须分别声明 Allow Unsigned Executable Memory Entitlement
(英文) 或 Allow Execution of JIT-compiled Code Entitlement
(英文)。在一些情形中,如果主机可执行文件缺少适当的授权,插件甚至无法载入。
另外,也请附上资源访问授权 (如地址簿或位置访问授权) 和相关的用途字符串,以支持 App 的插件。例如,如果提供传真服务的打印对话框扩展 (PDE) 想要访问用户的联系人列表,主机可执行文件必须声明 Address Book Entitlement
(英文) 并在其信息属性列表 (英文) 中为要运行的插件附上 NSContacts
(英文) 用途字符串。
如需强化版运行时授权的完整列表,请参阅“强化版运行时 (英文)”。有关用途字符串的信息,请参阅“请求访问受保护的资源 (英文)”。
重要信息
在 macOS 10.14.x 中,对于使用强化版运行时的可执行文件,只有当主机可执行文件具有 Disable Library Validation Entitlement
(英文) 时,PDE 才会载入。自 macOS 10.15 起,将不再需要这项授权。
在分发流程中自动公证你的 App
在将你的 App 直接分发给客户前,你的账户持有人必须使用你的 Developer ID 为 App 签名。Xcode 的 Organizer 窗口包含用于生成 App 可分发版本的工作流程。在 Xcode 10 及更高版本中,这个工作流程包含一个用于自动公证 macOS App 的选项。要使用这个工作流程对你的 App 进行公证,请进行以下操作:
-
打开你的 Xcode 项目。
-
为你的 App 创建归档。
-
打开 Xcode 的 Organizer 窗口。
-
在“Archives”(归档) 标签页中,选择你创建的归档。
-
点按“Distribute App”(分发 App),以查看分发选项。
-
选取适用于你的分发方法的 Developer ID。
-
点按“Next”(下一步)。
-
选取“Upload”(上传),将你的归档发送到 Apple 公证服务。
-
点按“Next”(下一步)。
点按“Next”(下一步) 时,Xcode 会将你的归档上传到公证服务。上传完成时,公证服务会开始扫描流程,用时通常不到一小时。在公证服务扫描你的软件期间,你可以继续对归档进行分发准备。例如,你可以导出归档,并完成在将软件提供给客户前需要进行的最终测试。
当公证流程结束时,Xcode 会下载凭证并附加到你的归档。这时,再次导出你的归档,就能获得含有公证凭证的可分发版软件。有关如何使用 Xcode UI 上传软件的更多信息,请参阅“上传 macOS App 进行公证”。
对于 macOS App 以外的目标,可使用 altool
命令行实用程序来公证,具体如“自定公证工作流程 (英文)”中所述。
对既有软件进行公证
在你对既有软件进行公证后,“门禁”会在用户尝试运行该软件时提醒用户。它也有助于公证服务将你的合法软件和遭到篡改的变体区分开来。你可以对现有的磁盘映像、安装器软件包或含有你的 App 的 ZIP 归档进行公证。
要对你的既有软件进行公证,请进行以下操作:
-
使 Xcode 10 成为你的活跃 Xcode 安装。(如果你不确定 Xcode 10 是不是活跃的安装,请使用
xcode-select
命令行使它处于活跃状态。有关如何使用此工具的信息,请参阅对应的手册页,具体如“阅读 UNIX 手册页 (英文)”中所述。) -
将你的软件上传到 Apple 公证服务,具体如“将你的 App 上传到公证服务 (英文)”中所述。
-
将返回的凭证附加到你的现有软件,具体如“将凭证附加到你的分发 (英文)”中所述。
注释
在提交软件进行公证前,你不需要重新构建或重新签名,但必须使用 Xcode 10 来完成公证步骤。提交你之前发布的所有版本,以及你最近的版本,以便保护继续使用你旧版软件的用户。
如需关于如何解决公证期间可能出现的问题的提示,请参阅“解决常见的公证问题 (英文)”。
在你的构建脚本中添加公证步骤
如果你使用自动化构建系统,可以将公证流程整合到现有的构建脚本中。通过 altool
和 stapler
命令行工具 (Xcode 已随附),你可以将软件上传到 Apple 公证服务,并将生成的凭证附加到你的可执行文件。
有关如何将公证整合到自定构建脚本的信息,请参阅“自定公证工作流程 (英文)”。