写作背景
在开始技术实践之前,先简单说明一下这篇文章的写作背景。目前网上关于Tauri构建macOS应用的完整指南相对较少,特别是涉及代码签名和公证的详细实践步骤。本文的主要目的有两个:
- 个人记录 - 作为自己在Tauri开发过程中的经验总结和技术备忘
- 社区贡献 - 希望能为同样遇到macOS构建问题的开发者提供一个完整的解决方案
为什么需要代码签名和公证?
当我们开发完成一个Tauri应用并准备在macOS上分发时,经常会遇到用户反馈的两个核心问题,这些问题直接影响了应用的用户体验和可信度:
代码签名的必要性
问题现象: 如果不进行代码签名,用户在安装或首次运行应用时会遇到以下错误提示:
"应用程序" 已损坏,无法打开。您应该将它移到废纸篓。
产生原因: 这是因为macOS的Gatekeeper安全机制会阻止运行未经Apple认证的应用程序。从macOS 10.15 Catalina开始,Apple进一步加强了对未签名应用的限制,未签名的应用会被标记为”损坏”。
影响:
- 用户无法正常启动应用
- 降低用户对应用的信任度
- 可能导致用户直接放弃使用
- 增加技术支持的工作量
软件公证的必要性
问题现象: 即使进行了代码签名,如果没有进行软件公证,用户仍可能在安装时看到警告:
macOS无法验证此App不包含恶意软件。
产生原因: 从macOS 10.15开始,Apple要求所有在macOS上分发的软件都必须经过公证(Notarization)。公证是Apple的一项自动化服务,它会扫描你的软件是否包含恶意内容,并为通过检查的软件颁发票证。
影响:
- 用户需要额外的步骤才能安装应用
- 显示安全警告会让用户产生疑虑
- 可能被误认为是恶意软件
- 影响应用的专业形象
解决方案的价值
通过正确的代码签名和公证流程,我们可以:
- 提升用户体验 - 用户可以无障碍地安装和运行应用
- 建立信任关系 - 显示开发者的专业性和对安全的重视
- 符合平台规范 - 遵循Apple的分发政策和最佳实践
- 减少支持成本 - 避免因安装问题产生的用户咨询
接下来,我们将详细介绍如何为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_IDENTITY
、APPLE_CERTIFICATE
、APPLE_CERTIFICATE_PASSWORD
)用于应用签名。- Apple ID 相关变量(如
APPLE_ID
、APPLE_PASSWORD
、APPLE_TEAM_ID
)或 App Store Connect API 相关变量(如APPLE_API_ISSUER
、APPLE_API_KEY
、APPLE_API_KEY_PATH
)用于应用公证。- 你可以根据实际需求选择 Apple ID 方式或 API 密钥方式进行公证。
详细说明和配置方法可参考 Tauri 官方文档。
准备工作
证书申请与导入流程
1. 生成证书签名请求(CSR)
在本地 Mac 上打开“钥匙串访问”,依次点击菜单栏 钥匙串访问 > 证书助理 > 从证书颁发机构请求证书...
,填写你的开发者邮箱和常用名称,选择“保存到磁盘”,生成一个 .certSigningRequest
文件。
2. 登录 Apple Developer 网站申请证书
- 进入 Apple Developer Certificates 页面。
- 点击右上角 “+” 按钮,选择
Developer ID Application
类型。 - 上传刚才生成的
.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
步骤操作:
打开“钥匙串访问”应用,点击左侧“登录”类型,切换到“我的证书”标签。
找到你的证书条目,展开后右键点击证书,选择“导出”。
选择保存为
.p12
文件,并为导出的证书设置一个密码(建议妥善保存)。在终端运行以下命令,将
.p12
文件转换为 base64 格式:openssl base64 -in /your path/certificate.p12 -out certificate.txt
打开
certificate.txt
文件,将内容设置为环境变量APPLE_CERTIFICATE
的值。将导出时设置的证书密码设置为环境变量
APPLE_CERTIFICATE_PASSWORD
。
这样可以方便在自动化构建或远程环境中安全使用证书。
获取并配置 Apple ID 的信息
在完成证书相关操作后,接下来需要准备 Apple ID 及相关信息,以便后续自动化签名和公证流程使用。
1. 获取 App 专用密码
- 访问 Apple 账户管理页面 并登录你的 Apple ID。
- 在“登录和安全”部分,找到“App 专用密码”。
- 点击“生成 App 专用密码”,并按照页面提示完成操作,保存生成的专用密码。
2. 配置环境变量
- 将你的 Apple ID 邮箱设置为
APPLE_ID
环境变量。 - 将上一步生成的 App 专用密码设置为
APPLE_PASSWORD
环境变量。
3. 获取 Apple Team ID
- 登录 Apple Developer 账户。
- 在“Membership”或“团队”信息页面,可以看到你的 Team ID。
- 将 Team ID 设置为
APPLE_TEAM_ID
环境变量。
小贴士:
这些环境变量在后续自动化打包、签名、公证等流程中会被频繁用到,建议妥善保存,并避免泄露。
获取并配置 App Store Connect 信息
在完成 Apple ID 相关配置后,还需要准备 App Store Connect 的集成密钥信息,以便后续自动化上传、公证等操作。
1. 生成 App Store Connect API 密钥
- 打开 App Store Connect 用户和访问页面 ,切换到“集成”选项卡。
- 点击右上角“+”按钮,添加新的密钥信息。
- 名字可以自定义,访问权限请选择“开发者”。
- 点击“生成”按钮,完成密钥创建。
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 根证书缺失或信任设置不当导致。请按如下步骤排查:
- 访问 AppleRootCA-G3.cer 下载并安装 Apple G3 根证书。
- 安装后,打开“钥匙串访问”,在“系统”钥匙串中找到“Apple Root CA - G3”证书。
- 右键点击证书,选择“显示简介”,在“信任”选项中,将“使用此证书时”设置为“使用系统默认”(切勿选择“始终信任”)。
- 关闭窗口保存设置,重启“钥匙串访问”或电脑。
- 重新执行 Tauri 的公证流程。
特别提醒:
“始终信任”会导致 Apple 公证服务无法正确识别证书链,务必选择“使用系统默认”。
如仍有问题,建议检查证书链完整性,并参考 Tauri 官方文档或社区讨论。
Comments