Tauri MacOS应用构建指南:从打包、代码签名到公证实践

前端

写作背景

在开始技术实践之前,先简单说明一下这篇文章的写作背景。目前网上关于Tauri构建macOS应用的完整指南相对较少,特别是涉及代码签名和公证的详细实践步骤。本文的主要目的有两个:

  1. 个人记录 - 作为自己在Tauri开发过程中的经验总结和技术备忘
  2. 社区贡献 - 希望能为同样遇到macOS构建问题的开发者提供一个完整的解决方案

为什么需要代码签名和公证?

当我们开发完成一个Tauri应用并准备在macOS上分发时,经常会遇到用户反馈的两个核心问题,这些问题直接影响了应用的用户体验和可信度:

代码签名的必要性

问题现象: 如果不进行代码签名,用户在安装或首次运行应用时会遇到以下错误提示:

"应用程序" 已损坏,无法打开。您应该将它移到废纸篓。

产生原因: 这是因为macOS的Gatekeeper安全机制会阻止运行未经Apple认证的应用程序。从macOS 10.15 Catalina开始,Apple进一步加强了对未签名应用的限制,未签名的应用会被标记为”损坏”。

影响:

  • 用户无法正常启动应用
  • 降低用户对应用的信任度
  • 可能导致用户直接放弃使用
  • 增加技术支持的工作量

软件公证的必要性

问题现象: 即使进行了代码签名,如果没有进行软件公证,用户仍可能在安装时看到警告:

macOS无法验证此App不包含恶意软件。

产生原因: 从macOS 10.15开始,Apple要求所有在macOS上分发的软件都必须经过公证(Notarization)。公证是Apple的一项自动化服务,它会扫描你的软件是否包含恶意内容,并为通过检查的软件颁发票证。

影响:

  • 用户需要额外的步骤才能安装应用
  • 显示安全警告会让用户产生疑虑
  • 可能被误认为是恶意软件
  • 影响应用的专业形象

解决方案的价值

通过正确的代码签名和公证流程,我们可以:

  1. 提升用户体验 - 用户可以无障碍地安装和运行应用
  2. 建立信任关系 - 显示开发者的专业性和对安全的重视
  3. 符合平台规范 - 遵循Apple的分发政策和最佳实践
  4. 减少支持成本 - 避免因安装问题产生的用户咨询

接下来,我们将详细介绍如何为Tauri应用实现完整的代码签名和公证流程。

Tauri 代码签名与公证所需环境变量

在 macOS 上对 Tauri 应用进行签名和公证时,通常需要配置以下环境变量:

下文会详细介绍每个变量的获取方式和来源。

  • APPLE_SIGNING_IDENTITY:签名证书在钥匙串中的名称(签名标识)。
  • APPLE_CERTIFICATE:从钥匙串导出的 .p12 证书的 base64 字符串(适用于 CI 或没有本地证书时)。
  • APPLE_CERTIFICATE_PASSWORD.p12 证书的密码。
  • APPLE_ID:你的 Apple 账号邮箱(用于公证)。
  • APPLE_PASSWORD:Apple 账号的 App 专用密码(用于公证)。
  • APPLE_TEAM_ID:你的 Apple 开发者团队 ID(用于公证)。
  • APPLE_API_ISSUER:App Store Connect API 的 Issuer ID(用于公证,可选)。
  • APPLE_API_KEY:App Store Connect API 的密钥 ID(用于公证,可选)。
  • APPLE_API_KEY_PATH:App Store Connect API 的私钥文件路径(用于公证,可选)。
  • APPLE_API_KEY_CONTENT:App Store Connect API 的私钥内容(base64,可选)。

说明:

  • 证书相关变量(如 APPLE_SIGNING_IDENTITYAPPLE_CERTIFICATEAPPLE_CERTIFICATE_PASSWORD)用于应用签名。
  • Apple ID 相关变量(如 APPLE_IDAPPLE_PASSWORDAPPLE_TEAM_ID)或 App Store Connect API 相关变量(如 APPLE_API_ISSUERAPPLE_API_KEYAPPLE_API_KEY_PATH)用于应用公证。
  • 你可以根据实际需求选择 Apple ID 方式或 API 密钥方式进行公证。

详细说明和配置方法可参考 Tauri 官方文档

准备工作

证书申请与导入流程

1. 生成证书签名请求(CSR)

在本地 Mac 上打开“钥匙串访问”,依次点击菜单栏 钥匙串访问 > 证书助理 > 从证书颁发机构请求证书...,填写你的开发者邮箱和常用名称,选择“保存到磁盘”,生成一个 .certSigningRequest 文件。

2. 登录 Apple Developer 网站申请证书

  1. 进入 Apple Developer Certificates 页面。
  2. 点击右上角 “+” 按钮,选择 Developer ID Application 类型。
  3. 上传刚才生成的 .certSigningRequest 文件,提交后即可下载到 .cer 证书文件。

如果需要签名安装包(.pkg),同理选择 Developer ID Installer 类型申请。其它证书类型请根据实际需求自行了解。

3. 导入证书到钥匙串

双击下载的 .cer 文件,证书会自动导入到“登录”钥匙串。可以在“钥匙串访问”中搜索 Developer ID Application 或你的开发者名称,确认证书已导入。

证书导入钥匙串后,可以在“钥匙串访问”应用的“我的证书”标签下,找到你的证书条目,名称即为签名标识(如:Developer ID Application: 你的名字 (XXXXXXXXXX))。你也可以在终端执行以下命令,列出所有可用的签名标识:

security find-identity -v -p codesigning

输出结果中类似于 1) XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX "Developer ID Application: 你的名字 (XXXXXXXXXX)",其中最前面的那串大写字母和数字就是证书的 SHA-1 指纹。

你可以将 APPLE_SIGNING_IDENTITY 设置为证书的完整名称(如:

APPLE_SIGNING_IDENTITY="Developer ID Application: 你的名字 (XXXXXXXXXX)"

但更推荐直接填写证书的 SHA-1 指纹(即上面命令输出行最前面的那串),例如:

APPLE_SIGNING_IDENTITY="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

这样最为精准,也能避免因证书名称变化导致的识别问题。

注意:
如果你的钥匙串中存在多个同名证书(例如多个 Developer ID Application: 你的名字 (XXXXXXXXXX)),直接使用证书名称作为 APPLE_SIGNING_IDENTITY 可能会导致签名时匹配到错误的证书。
此时,更推荐使用证书的 SHA-1 指纹,这样可以确保唯一且精准地指定所需证书,避免因重名导致的各种问题。

4. 导出证书为 p12

步骤操作:

  1. 打开“钥匙串访问”应用,点击左侧“登录”类型,切换到“我的证书”标签。

  2. 找到你的证书条目,展开后右键点击证书,选择“导出”。

  3. 选择保存为 .p12 文件,并为导出的证书设置一个密码(建议妥善保存)。

  4. 在终端运行以下命令,将 .p12 文件转换为 base64 格式:

    openssl base64 -in /your path/certificate.p12 -out certificate.txt
  5. 打开 certificate.txt 文件,将内容设置为环境变量 APPLE_CERTIFICATE 的值。

  6. 将导出时设置的证书密码设置为环境变量 APPLE_CERTIFICATE_PASSWORD

这样可以方便在自动化构建或远程环境中安全使用证书。

获取并配置 Apple ID 的信息

在完成证书相关操作后,接下来需要准备 Apple ID 及相关信息,以便后续自动化签名和公证流程使用。

1. 获取 App 专用密码

  1. 访问 Apple 账户管理页面 并登录你的 Apple ID。
  2. 在“登录和安全”部分,找到“App 专用密码”。
  3. 点击“生成 App 专用密码”,并按照页面提示完成操作,保存生成的专用密码。

2. 配置环境变量

  • 将你的 Apple ID 邮箱设置为 APPLE_ID 环境变量。
  • 将上一步生成的 App 专用密码设置为 APPLE_PASSWORD 环境变量。

3. 获取 Apple Team ID

  1. 登录 Apple Developer 账户
  2. 在“Membership”或“团队”信息页面,可以看到你的 Team ID。
  3. 将 Team ID 设置为 APPLE_TEAM_ID 环境变量。

小贴士:
这些环境变量在后续自动化打包、签名、公证等流程中会被频繁用到,建议妥善保存,并避免泄露。

获取并配置 App Store Connect 信息

在完成 Apple ID 相关配置后,还需要准备 App Store Connect 的集成密钥信息,以便后续自动化上传、公证等操作。

1. 生成 App Store Connect API 密钥

  1. 打开 App Store Connect 用户和访问页面 ,切换到“集成”选项卡。
  2. 点击右上角“+”按钮,添加新的密钥信息。
  3. 名字可以自定义,访问权限请选择“开发者”。
  4. 点击“生成”按钮,完成密钥创建。

2. 配置环境变量

  • 在“集成”页面可以看到“Issuer ID”信息,复制并设置为 APPLE_API_ISSUER 环境变量。
  • 在有效的密钥列表中,有一列“密钥ID”,复制对应的密钥 ID 信息,并设置为 APPLE_API_KEY 环境变量。
  • 下载密钥文件(.p8),注意:密钥只能下载一次,且页面刷新后才可见下载按钮。下载后请妥善保存。
  • 打开下载的密钥文件,将内容设置为 APPLE_API_KEY_CONTENT 环境变量。
  • 将密钥文件路径(如 /your path/AuthKey_xxx.p8,其中xxx为你的密钥ID)设置为 APPLE_API_KEY_PATH 环境变量。

注意:
这些密钥和ID信息非常重要,建议妥善保存并避免泄露。密钥文件只能下载一次,丢失后需重新生成。

打包与环境变量检查

Tauri 应用打包流程本身较为简单,核心在于前面环境变量的正确配置。打包前请务必确认所有 Apple 相关环境变量已生效。

你可以在终端执行以下命令,检查环境变量:

env | grep APPLE

确保输出中包含了你设置的所有证书、公证等相关变量。

常见问题

如遇签名或公证失败,优先检查证书、环境变量(可用 env | grep APPLE 检查)、Apple ID 及密钥信息是否正确,并确保钥匙串中 Apple 根证书与中间证书完整(可前往 Apple 官方证书页面 下载缺失证书)。

staple and validate action failed! Error 65 解决办法

该错误多因 Apple G3 根证书缺失或信任设置不当导致。请按如下步骤排查:

  1. 访问 AppleRootCA-G3.cer 下载并安装 Apple G3 根证书。
  2. 安装后,打开“钥匙串访问”,在“系统”钥匙串中找到“Apple Root CA - G3”证书。
  3. 右键点击证书,选择“显示简介”,在“信任”选项中,将“使用此证书时”设置为“使用系统默认”(切勿选择“始终信任”)。
  4. 关闭窗口保存设置,重启“钥匙串访问”或电脑。
  5. 重新执行 Tauri 的公证流程。

特别提醒:
“始终信任”会导致 Apple 公证服务无法正确识别证书链,务必选择“使用系统默认”。

如仍有问题,建议检查证书链完整性,并参考 Tauri 官方文档或社区讨论。

Comments