跳至主要内容

代码签名 macOS 应用程序

本指南提供有关 macOS 应用程序的代码签名和公证的信息。

注意

如果你没有使用 GitHub Actions 来构建 OSX DMG,则需要确保存在环境变量 CI=true。有关更多信息,请参阅 tauri-apps/tauri#592

要求

  • macOS 10.13.6 或更高版本
  • Xcode 14 或更高版本
  • 已在 Apple 开发者计划 中注册的 Apple 开发者帐户

有关详细信息,请阅读开发者文章 在分发之前公证 macOS 软件

tl;dr

Tauri 代码签名和公证流程通过以下环境变量进行配置

  • APPLE_SIGNING_IDENTITY:包含签名证书的钥匙串条目的名称。
  • APPLE_CERTIFICATE:从钥匙串导出的 .p12 证书的 base64 字符串。如果您在钥匙串上没有证书(例如,CI 机器),则此方法非常有用。
  • APPLE_CERTIFICATE_PASSWORD.p12 证书的密码。
  • APPLE_IDAPPLE_PASSWORDAPPLE_TEAM_ID:您的 Apple 帐户电子邮件、特定于应用的密码 和您的 团队 ID。仅在需要对应用进行公证时需要。
  • APPLE_API_ISSUERAPPLE_API_KEYAPPLE_API_KEY_PATH:使用 App Store Connect API 密钥(而不是 Apple ID)进行身份验证。仅在您对应用进行公证时需要。

签名 Tauri 应用

对 macOS 应用程序进行签名的第一步是从 Apple 开发者计划获取签名证书。

创建签名证书

要创建新的签名证书,您必须从 Mac 电脑生成证书签名请求 (CSR) 文件。创建证书签名请求 介绍了如何创建 CSR。

在您的 Apple 开发者帐户中,导航到 证书、ID 和配置文件页面,然后单击 创建证书 按钮以打开创建新证书的界面。选择适当的证书类型(Apple Distribution 用于将应用提交到 App Store,Developer ID Application 用于在 App Store 外分发应用)。上传您的 CSR,证书将被创建。

注意

只有 Apple Developer 帐户持有者可以创建开发者 ID 应用程序证书。但可以通过使用不同的用户电子邮件地址创建 CSR 来将其与不同的 Apple ID 关联。

下载证书

证书、ID 和配置文件页面上,单击要使用的证书,然后单击下载按钮。它会保存一个.cer文件,该文件在打开后会在钥匙串上安装证书。钥匙串条目的名称代表签名标识,也可以通过执行security find-identity -v -p codesigning找到。

注意

只有在与你的 Apple ID 关联时,签名证书才有效。无效的证书不会列在钥匙串访问 > 我的证书选项卡或security find-identity -v -p codesigning输出中。如果证书未下载到正确的位置,请确保在下载 .cer 文件时在钥匙串访问的“默认钥匙串”下选择了“登录”选项。

对 Tauri 应用程序签名

签名配置通过环境变量提供给 Tauri 打包器。你需要配置要使用的证书和一个可选的身份验证配置来公证应用程序。

证书环境变量

  • APPLE_SIGNING_IDENTITY:这是我们上面强调的签名标识。必须定义它才能在本地和 CI 机器上对应用签名。通常只需使用括号中的部分就足够了,例如ABCDE12345中的开发者 ID 应用程序:Walter Tauri (ABCDE12345)

此外,为了简化 CI 上的代码签名过程,如果你定义APPLE_CERTIFICATEAPPLE_CERTIFICATE_PASSWORD环境变量,Tauri 可以为你将证书安装到钥匙串上。

  1. 打开钥匙串访问应用到登录 > 我的证书并找到你的证书的钥匙串条目。
  2. 展开条目,双击密钥项,然后选择导出“$KEYNAME”
  3. 选择保存 .p12 文件的路径并定义导出的证书密码。
  4. 在终端上运行以下脚本将 .p12 文件转换为 base64:openssl base64 -in /path/to/certificate.p12 -out certificate-base64.txt
  5. certificate-base64.txt 文件的内容设置为 APPLE_CERTIFICATE 环境变量。
  6. 将证书密码设置为 APPLE_CERTIFICATE_PASSWORD 环境变量。

身份验证环境变量

这些变量仅用于公证应用程序。

注意

使用开发者 ID 应用程序证书时需要公证。

  • APPLE_IDAPPLE_PASSWORDAPPLE_TEAM_ID:要使用 Apple ID 进行身份验证,请将 APPLE_ID 设置为您的 Apple 帐户电子邮件(例如:export [email protected]),并将 APPLE_PASSWORD 设置为 Apple 帐户的特定于应用程序的密码
  • APPLE_API_ISSUERAPPLE_API_KEYAPPLE_API_KEY_PATH:或者,您可以使用 App Store Connect API 密钥进行身份验证。打开 App Store Connect 的用户和访问页面,选择密钥选项卡,单击添加按钮,然后选择一个名称和开发者访问权限。APPLE_API_ISSUER颁发者 ID)显示在密钥表上方,而 APPLE_API_KEY 是该表上密钥 ID列中的值。您还需要下载私钥,该私钥只能下载一次,并且只能在重新加载页面后才能看到(该按钮显示在新创建的密钥的表行中)。私钥文件路径必须通过 APPLE_API_KEY_PATH 环境变量设置。

构建应用程序

在运行 tauri build 命令时,Tauri 捆绑器会自动使用所有这些环境变量对您的应用程序进行签名和公证。

示例

以下示例使用 GitHub Actions 使用Tauri 操作对应用程序进行签名。

我们首先将上面列出的环境变量定义为 GitHub 上的机密。

注意

你可以查看此指南以了解 GitHub 秘钥。

一旦我们建立了 GitHub 秘钥,我们就在 .github/workflows/main.yml 中创建一个 GitHub 发布工作流

name: 'publish'
on:
push:
branches:
- release

jobs:
publish-tauri:
permissions:
contents: write
strategy:
fail-fast: false
matrix:
platform: [macos-latest]
runs-on: ${{ matrix.platform }}

steps:
- name: Checkout repository
uses: actions/checkout@v3

- name: Rust setup
uses: dtolnay/rust-toolchain@stable

- name: Rust cache
uses: swatinem/rust-cache@v2
with:
workspaces: './src-tauri -> target'

- name: Sync node version and setup cache
uses: actions/setup-node@v3
with:
node-version: 'lts/*'
cache: 'yarn' # Set this to npm, yarn or pnpm.

- name: Install frontend dependencies
# If you don't have `beforeBuildCommand` configured you may want to build your frontend here too.
run: yarn install # Change this to npm, yarn or pnpm.

- name: Build the app
uses: tauri-apps/tauri-action@v0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
with:
tagName: app-v__VERSION__ # the action automatically replaces \_\_VERSION\_\_ with the app version
releaseName: 'App v__VERSION__'
releaseBody: 'See the assets to download this version and install.'
releaseDraft: true
prerelease: false

工作流从 GitHub 中提取秘钥,并在使用 Tauri 操作构建应用程序之前将它们定义为环境变量。输出是一个包含已签名和公证的 macOS 应用程序的 GitHub 版本。