为 macOS 应用程序进行代码签名

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

注意事项

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

所需条件

  • macOS 10.13.6 或更高版本
  • Xcode 10 或更高版本
  • 注册了 Apple开发者计划 的 Apple开发者帐户

如需了解更多详情,请阅读开发人员关于在发布前对 macOS 软件进行公证的文章。

环境变量

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

  • APPLE_SIGNING_IDENTITY: 包含签名证书的钥匙串条目名称。
  • APPLE_CERTIFICATE: 从钥匙串导出的 .p12 证书的 base64 字符串。如果证书不在钥匙串中(如 CI 机器),该功能将非常有用。
  • APPLE_CERTIFICATE_PASSWORD: .p12 证书的密码。
  • APPLE_ID, APPLE_PASSWORDAPPLE_TEAM_ID: 您的 Apple 帐户电子邮件、应用程序专用密码和您的团队 ID。只有在公证应用程序时才需要。
  • APPLE_API_ISSUER, APPLE_API_KEYAPPLE_API_KEY_PATH: 使用 App Store Connect API 密钥而不是 Apple ID 进行身份验证。只有在公证应用程序时才需要。

为Tauri应用程序签名

签署 macOS 应用程序的第一步是从 Apple Developer Program 获取签名证书。

创建签名证书

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

在你的 Apple Developer 帐户上,导航到 "证书、ID 和配置文件 "页面,点击 "创建证书 "按钮,打开创建新证书的界面。选择适当的证书类型(Apple Distribution 用于向 App Store 提交应用程序,Developer ID Application 用于在 App Store 以外发布应用程序)。上传您的 CSR,证书就会创建。

注意事项

只有苹果开发者账户持有人才能创建开发者 ID 应用程序证书。但可以通过使用不同的用户电子邮件地址创建 CSR,将其与不同的 Apple ID 关联。

下载证书

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

注意事项

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

为Tauri应用程序签名

签名配置通过环境变量提供给 Tauri打包程序。您需要配置要使用的证书和可选的身份验证配置,以便对应用程序进行公证。

证书环境变量

  • APPLE_SIGNING_IDENTITY: 就是我们上面强调的签名标识。必须定义该标识,以便在本地和 CI 机器上签署应用程序。

此外,为了简化 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_ID, APPLE_PASSWORDAPPLE_TEAM_ID: 要使用 Apple ID 进行身份验证,请将 APPLE_ID 设置为 Apple 帐户电子邮件(例如:导出 APPLE_ID=tauri@icloud.com),并将 APPLE_PASSWORD 设置为 Apple 帐户的特定应用程序密码
  • APPLE_API_ISSUER, APPLE_API_KEYAPPLE_API_KEY_PATH: 您也可以使用 App Store Connect API 密钥进行身份验证。打开 App Store Connect 的 "用户和访问 "页面,选择 "密钥 "选项卡,点击 "添加 "按钮,然后选择名称和开发人员访问权限。密钥表上方显示的是 APPLE_API_ISSUER(发行方 ID),APPLE_API_KEY 是该表中Key ID列上的值。你还需要下载私钥,下载只能进行一次,而且只有在重新加载页面后才能看到(按钮显示在新创建密钥的表格行上)。私钥文件路径必须通过 APPLE_API_KEY_PATH 环境变量设置。

构建应用程序

在运行 tauri build命令时,Tauri 打包程序会根据设置的所有这些环境变量自动签署和公证应用程序。

示例

下面的示例使用 GitHub Actions 来签署一个使用Tauri action的应用程序。

我们首先定义上文列出的环境变量,如 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 }}
        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

在使用 Tauri 操作构建应用程序之前,工作流程会从 GitHub 提取密钥并将其定义为环境变量。输出结果是 GitHub 发布的带签名和公证的 macOS 应用程序。