代码签名
本教程共 48 篇 · 第 45 篇 · 更新于 2026-08-09 · 约 10 分钟阅读
本节目标:读完你能理解代码签名为什么重要,并在 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 信任,不弹警告,但价格贵
Warning2023 年 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_ID、AZURE_TENANT_ID、AZURE_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_ID、AZURE_CLIENT_SECRET、AZURE_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)。
创建签名证书
- 在 Mac 上生成证书签名请求(CSR)
- 到 Apple Developer 的 Certificates 页面创建证书
- 上架 App Store:选
Apple Distribution - App Store 外分发:选
Developer ID Application
- 上架 App Store:选
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
- 在 App Store Connect 的 Users and Access 页面创建 API Key
- 设置环境变量:
APPLE_API_ISSUER:Issuer IDAPPLE_API_KEY:Key IDAPPLE_API_KEY_PATH:下载的私钥文件路径
方式二:Apple ID
- 设置
APPLE_ID为你的 Apple 账号邮箱 - 设置
APPLE_PASSWORD为应用专用密码(在 appleid.apple.com 生成) - 设置
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
WarningAppImage 不会自动验证签名。用户需要手动用 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.json 的 bundle 字段或环境变量中完成。CI/CD 环境下用环境变量传递证书和密码,Tauri CLI 会自动识别处理。