小玩具

最近 Vibe Coding 上头,把之前买的Mac mini m4 (上车上的早,没想到成理财产品了),又翻出来玩玩。

但是升级到 MacOS 26 后发现,如果不签名。进行 App 分发举步维艰。于是就有了本文。

1. 前期准备

  1. 一个开发者账号
  2. 代码签名:使用 Developer ID Application 证书及其私钥,通常保存为 P12;
  3. Apple 公证:使用 App Store Connect API Key,包含 P8、Key ID 和 Issuer ID。

关于 p12 证书是否导入钥匙串:

场景TauriElectron(electron-builder)
本地 Mac建议把 P12 导入登录钥匙串建议把 P12 导入登录钥匙串,但非必须
CI/CD通常由 CI 脚本导入临时钥匙串可设置 CSC_LINK,由 electron-builder 处理
P12 已在钥匙串设置签名 identity可自动发现,CSC_NAME 可选

P8 不需要导入代码签名钥匙串,只需以文件形式提供给公证工具。

warning: 在同时对 Tauri 和 Electron,进行签名和公正时,请注意环境变量问题,尤其是 APPLE_API_KEY 的含义完全不同。

Tauri: APPLE_API_KEY = Key ID Electron: APPLE_API_KEY = P8 文件路径


2. Tauri

先把 P12 导入登录钥匙串

先把 P12 导入登录钥匙串,我的证书中。中途会要求输入 P12 证书密码。

添加证书到钥匙串

然后检查签名身份

1security find-identity -v -p codesigning

配置环境变量

配置环境变量如下

1# 签名
2export APPLE_SIGNING_IDENTITY="Developer ID Application: Your Name (ABCDE12345)"
3
4# 公正
5# Tauri 中 APPLE_API_KEY 表示 Key ID。
6export APPLE_API_KEY="KEYID12345"
7export APPLE_API_ISSUER="00000000-0000-0000-0000-000000000000"
8export APPLE_API_KEY_PATH="$HOME/.private_keys/AuthKey_KEYID12345.p8"

配置环境变量

也可以把签名身份写入 tauri.conf.json

1{
2  "bundle": {
3    "macOS": {
4      "signingIdentity": "Developer ID Application: Your Name (ABCDE12345)"
5    }
6  }
7}

构建和验证

然后执行 pnpm tauri build 进行构建就可以了。

构建

使用命令验证签名和公正结果

1# 验证代码签名
2codesign -v --verbose <需要验证的APP>
3
4# 验证公证票据
5xcrun stapler validate <需要验证的APP>

签名和公正成功

到此部分,Tauri部分就搞定了~


3. Electron

配置环境变量

配置环境变量

签名环境变量:

1# 导入到钥匙串,指定证书名
2export CSC_NAME="Developer ID Application: Your Name (ABCDE12345)"
3
4# 没有导入钥匙串
5export CSC_LINK="<P12 证书路径 / P12 证书URL / P12 证书 Base64内容>"
6export CSC_KEY_PASSWORD="<P12 证书密码>"

公证环境变量:

1# APPLE_API_KEY 表示 P8 文件路径,且和p8证书ID对应
2export APPLE_API_KEY="$HOME/.private_keys/AuthKey_KEYID12345.p8"
3export APPLE_API_KEY_ID="KEYID12345"
4export APPLE_API_ISSUER="00000000-0000-0000-0000-000000000000"

electron-builder 配置

package.json

 1{
 2  "build": {
 3    "forceCodeSigning": true,
 4    "mac": {
 5      "target": ["dmg", "zip"],
 6      "hardenedRuntime": true,
 7      "notarize": true,
 8      "entitlements": "build/entitlements.mac.plist",
 9      "entitlementsInherit": "build/entitlements.mac.inherit.plist"
10    }
11  }
12}

构建&验证

构建 Electron App

1pnpm exec electron-builder --mac dmg zip

构建 Electron App

使用命令验证签名和公正结果

1# 验证代码签名
2codesign -v --verbose <需要验证的APP>
3
4# 验证公证票据
5xcrun stapler validate <需要验证的APP>

签名和公正都验证通过

至此,如何对 Tauri 与 Electron 进行 macOS 签名、公证的流程就全部跑通了。

下一篇,我们去尝试下使用 CI/CD 工具进行自动化构建、签名、公正。