首页 / Tauri 2 入门教程 / 代码签名

Tauri 2 入门教程

代码签名

本教程共 48 篇 · 第 45 篇 · 更新于 2026-08-09 · 约 10 分钟阅读

TauriTauri 2 入门教程代码签名Code Signing证书SmartScreenNotarizationGPG

本节目标:读完你能理解代码签名为什么重要,并在 Windows、macOS、Linux 上分别配置 Tauri 2 的签名流程。

你打了个安装包发给用户,用户下载后双击——弹出一个红色警告:「此应用不受信任,可能危害你的电脑」。这就是没签名的后果。代码签名(Code Signing)就是用数字证书给你的安装包盖个章,证明「这个包是我发的,没被篡改」。各平台有不同的签名机制,本章按平台分别讲。

代码签名是什么

打个比方:你收到一封信,怎么确认是本人写的?看签名。代码签名同理——开发者用私钥给文件签名,操作系统用公钥验证。验证通过就不弹警告,验证失败就拦截。

签名的好处:

  • 防篡改:文件被改过一个字节,签名就失效
  • 身份认证:用户能看到发布者名字(公司或个人)
  • 系统信任:Windows SmartScreen、macOS Gatekeeper 不会拦
Note

代码签名在多数平台是「强烈建议」而非强制。不签名也能跑,但用户会看到吓人的警告。macOS App Store 和 Microsoft Store 则是必须签名。

Windows 代码签名

Windows 上签名的作用是消除 SmartScreen 警告,以及上架 Microsoft Store。

证书类型

Windows 代码签名证书分两种:

  • OV(Organization Validated):验证组织身份,价格便宜,但 SmartScreen 仍会弹警告,需要积累「信誉」后才消失
  • EV(Extended Validation):严格审核,签名后立即获得 SmartScreen 信任,不弹警告,但价格贵
Warning

2023 年 6 月 1 日之后获取的 OV 证书必须使用硬件令牌(USB Key)存储私钥,不再支持文件形式。本节的 OV 教程仅适用于该日期之前获取的证书。新证书请参考证书供应商的文档,或使用 Azure Key Vault / Azure Artifact Signing 方案。

用 OV 证书签名

第 1 步:把 .cer 转成 .pfx

你需要证书文件(.cer)和私钥文件(.key)。用 OpenSSL 转换:

openssl pkcs12 -export -in cert.cer -inkey private-key.key -out certificate.pfx

会提示你设一个导出密码,记住它。

第 2 步:导入证书到系统

PowerShell:

$PASSWORD = '你的导出密码'
Import-PfxCertificate -FilePath certificate.pfx -CertStoreLocation Cert:\CurrentUser\My -Password (ConvertTo-SecureString -String $PASSWORD -Force -AsPlainText)

第 3 步:获取签名信息

打开 certmgr.msc(开始菜单搜),找到刚导入的证书,双击查看详情:

  • 「签名 hash 算法」就是 digestAlgorithm(通常是 sha256
  • 「指纹(Thumbprint)」就是 certificateThumbprint(一串十六进制字符)

还需要一个时间戳 URL(用于验证签名时间),用证书供应商提供的,比如 http://timestamp.comodoca.com

第 4 步:配置 tauri.conf.json

{
  "bundle": {
    "windows": {
      "certificateThumbprint": "A1B1A2B2A3B3A4B4A5B5A6B6A7B7A8B8A9B9A0B0",
      "digestAlgorithm": "sha256",
      "timestampUrl": "http://timestamp.comodoca.com"
    }
  }
}

第 5 步:构建

tauri build

控制台输出 Successfully signed 就说明签名成功了。

Azure Key Vault 签名

如果你用 Azure Key Vault 管理证书,可以用 relic 工具来签名。

第 1 步:在 Azure Portal 创建 Key Vault 和证书,记下 Key Vault 名称和证书名称。

第 2 步:在 src-tauri/relic.conf 配置:

tokens:
  azure:
    type: azure

keys:
  azure:
    token: azure
    id: https://<vault-name>.vault.azure.net/certificates/<cert-name>

第 3 步:在 tauri.conf.json 配置自定义签名命令:

{
  "bundle": {
    "windows": {
      "signCommand": "relic sign --file %1 --key azure --config relic.conf"
    }
  }
}

第 4 步:设置 Azure 环境变量(AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_CLIENT_SECRET),然后 tauri build 即可。

Azure Artifact Signing

这是 Azure 新的签名服务。需要安装 artifact-signing-cli 工具:

cargo install artifact-signing-cli

配置 tauri.conf.json

{
  "bundle": {
    "windows": {
      "signCommand": "artifact-signing-cli -e https://wus2.codesigning.azure.net -a MyAccount -c MyProfile -d MyApp %1"
    }
  }
}

设置环境变量 AZURE_CLIENT_IDAZURE_CLIENT_SECRETAZURE_TENANT_ID 后即可构建。

Tip

跨平台编译 Windows 安装包时(在 Linux/macOS 上构建),必须用自定义 signCommand,因为默认签名工具只在 Windows 上运行。

在 GitHub Actions 中签名

.pfx 证书 Base64 编码后存为 GitHub Secret:

certutil -encode certificate.pfx base64cert.txt

在 workflow 里加一步导入证书:

- name: import windows certificate
  if: matrix.platform == 'windows-latest'
  env:
    WINDOWS_CERTIFICATE: ${{ secrets.WINDOWS_CERTIFICATE }}
    WINDOWS_CERTIFICATE_PASSWORD: ${{ secrets.WINDOWS_CERTIFICATE_PASSWORD }}
  run: |
    New-Item -ItemType directory -Path certificate
    Set-Content -Path certificate/tempCert.txt -Value $env:WINDOWS_CERTIFICATE
    certutil -decode certificate/tempCert.txt certificate/certificate.pfx
    Remove-Item -Path certificate/tempCert.txt
    Import-PfxCertificate -FilePath certificate/certificate.pfx -CertStoreLocation Cert:\CurrentUser\My -Password (ConvertTo-SecureString -String $env:WINDOWS_CERTIFICATE_PASSWORD -Force -AsPlainText)

macOS 代码签名

macOS 上不签名的应用会被 Gatekeeper 拦截,用户看到的是「应用已损坏,无法打开」。

前置条件

需要一个 Apple Developer 账号。付费版($99/年)可以上架 App Store 和对外分发;免费版只能本地测试,不能公证(Notarize)。

创建签名证书

  1. 在 Mac 上生成证书签名请求(CSR)
  2. 到 Apple Developer 的 Certificates 页面创建证书
    • 上架 App Store:选 Apple Distribution
    • App Store 外分发:选 Developer ID Application
Note

只有开发者账号的 Account Holder 才能创建 Developer ID Application 证书。但可以用其他 Apple ID 的邮箱生成 CSR 来关联。

本地签名

下载 .cer 证书文件,双击安装到钥匙串。然后用命令查看签名身份:

security find-identity -v -p codesigning

把输出的身份名称填到 tauri.conf.json

{
  "bundle": {
    "macOS": {
      "signingIdentity": "Developer ID Application: Your Name (XXXXXXXXXX)"
    }
  }
}

或者用环境变量:

export APPLE_SIGNING_IDENTITY="Developer ID Application: Your Name (XXXXXXXXXX)"

在 CI/CD 中签名

CI/CD 平台上没有钥匙串,需要把证书导出为 .p12 文件再 Base64 编码:

openssl base64 -A -in certificate.p12 -out certificate-base64.txt

设置两个环境变量:

  • APPLE_CERTIFICATE:Base64 编码的 .p12 文件内容
  • APPLE_CERTIFICATE_PASSWORD:导出 .p12 时设的密码

Tauri CLI 会自动识别这两个变量并在 CI 环境中安装证书。

公证(Notarization)

Developer ID Application 证书签名的应用还必须经过 Apple 公证(Notarization)才能被 Gatekeeper 信任。公证需要提供 Apple 账号凭证,有两种方式:

方式一:App Store Connect API Key

  1. 在 App Store Connect 的 Users and Access 页面创建 API Key
  2. 设置环境变量:
    • APPLE_API_ISSUER:Issuer ID
    • APPLE_API_KEY:Key ID
    • APPLE_API_KEY_PATH:下载的私钥文件路径

方式二:Apple ID

  1. 设置 APPLE_ID 为你的 Apple 账号邮箱
  2. 设置 APPLE_PASSWORD 为应用专用密码(在 appleid.apple.com 生成)
  3. 设置 APPLE_TEAM_ID 为你的 Team ID

设好环境变量后重新构建:

tauri build --bundles dmg

Tauri 会在签名后自动提交公证。根据需要配置 stapling(附加公证票据)选项,具体参数请参考当前版本的 Tauri CLI 帮助。

Warning

使用免费 Apple Developer 账号无法进行公证,应用打开时仍会显示「未验证」。

临时签名(Ad-Hoc)

如果你只是本地测试、不想折腾证书,可以用临时签名。在 tauri.conf.json 里设:

{
  "bundle": {
    "macOS": {
      "signingIdentity": "-"
    }
  }
}

- 是伪签名身份,表示不做身份认证的签名。Apple Silicon Mac 上从网上下载的应用必须有签名才能运行,临时签名能让你过这一关,但用户仍需在「系统设置 → 隐私与安全性」里手动允许。

Linux 代码签名

Linux 上代码签名不是强制的,但可以增加用户信任。AppImage 和 RPM 包各自有不同的签名机制。

AppImage 签名

AppImage 用 GPG 签名。先生成 GPG 密钥:

gpg2 --full-gen-key

构建时通过环境变量启用签名:

export SIGN=1
export SIGN_KEY="你的 GPG Key ID"
export APPIMAGETOOL_SIGN_PASSPHRASE="密钥密码"
tauri build --bundles appimage

查看签名信息:

./myapp.AppImage --appimage-signature
Warning

AppImage 不会自动验证签名。用户需要手动用 validate 工具验证。你必须通过安全渠道(如 HTTPS 网站)公布你的 GPG 公钥,用户才能验证。详见 AppImage 签名文档

RPM 签名

RPM 包用 GPG 签名。设置环境变量:

export TAURI_SIGNING_RPM_KEY=$(cat /path/to/private.key)
export TAURI_SIGNING_RPM_KEY_PASSPHRASE="密码"

然后正常构建 tauri build --bundles rpm 即可。验证签名:

rpm -v --checksig myapp-0.0.0-1.x86_64.rpm

deb 包

deb 格式本身没有内置签名机制,Tauri 不提供 deb 签名功能。如果需要,可以在构建后用 dpkg-sig 手动签名。

小结

代码签名各平台机制不同但目的相同:让用户和操作系统信任你的应用。Windows 用 OV/EV 证书或 Azure Key Vault/Artifact Signing,签名后消除 SmartScreen 警告;macOS 用 Apple Developer 证书签名并公证(Notarization),否则 Gatekeeper 会拦截;Linux 上 AppImage 和 RPM 可选 GPG 签名,deb 无内置签名。签名配置主要在 tauri.conf.jsonbundle 字段或环境变量中完成。CI/CD 环境下用环境变量传递证书和密码,Tauri CLI 会自动识别处理。