关于 signing-tauri-apps
面向 Tauri 应用开发者的跨平台代码签名指南,覆盖 Android、iOS、Linux、macOS 和 Windows。内容包括证书配置、CI/CD 环境变量以及 macOS 公证和 Windows 云端签名。
主要功能
- 01覆盖五个平台的签名流程
- 02配置证书与签名身份
- 03准备 CI/CD 签名环境变量
- 04处理 macOS 公证
- 05配置 Windows 自定义签名命令
- 06验证 Linux AppImage 签名
适用场景
- 01为应用商店发布准备 Android 或 iOS 签名
- 02配置 macOS 应用签名与公证
- 03为 Windows 构建设置证书签名
- 04在 CI/CD 中管理签名凭据
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ dchuk/ claude-code-tauri-skills --skill signing-tauri-apps安装后在 Claude Code 中输入/signing-tauri-apps确认已加载。
详细介绍
Tauri 代码签名技能
本技能全面介绍如何为所有受支持平台上的 Tauri 应用进行代码签名。
平台概览
| 平台 | 要求 | 证书类型 |
|---|---|---|
| Android | 发布到 Play Store 时必需 | Java Keystore (JKS) |
| iOS | 发布时必需 | Apple Developer 证书 |
| Linux | 可选(增强可信度) | GPG 密钥 |
| macOS | 发布时必需 | Developer ID / Apple Distribution |
| Windows | 必需(SmartScreen) | OV 或 EV 证书 |
Android 签名
生成 Keystore
macOS/Linux:
keytool -genkey -v -keystore ~/upload-keystore.jks -keyalg RSA -keysize 2048 -validity 10000 -alias upload
Windows:
keytool -genkey -v -keystore $env:USERPROFILE\upload-keystore.jks -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias upload
配置文件
创建 src-tauri/gen/android/keystore.properties:
password=<your-password>
keyAlias=upload
storeFile=/path/to/upload-keystore.jks
重要: 切勿将 keystore.properties 提交到版本控制中。
Gradle 配置
修改 src-tauri/gen/android/app/build.gradle.kts:
import java.io.FileInputStream
// Add before android { } block
val keystorePropertiesFile = rootProject.file("keystore.properties")
val keystoreProperties = java.util.Properties()
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}
android {
// ... existing config ...
signingConfigs {
create("release") {
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["password"] as String
storeFile = file(keystoreProperties["storeFile"] as String)
storePassword = keystoreProperties["password"] as String
}
}
buildTypes {
release {
signingConfig = signingConfigs.getByName("release")
// ... other release config ...
}
}
}
CI/CD 环境变量
| 变量 | 描述 |
|---|---|
ANDROID_KEY_ALIAS | 密钥别名(例如,upload) |
ANDROID_KEY_PASSWORD | Keystore 密码 |
ANDROID_KEY_BASE64 | Base64 编码的 Keystore 文件 |
GitHub Actions 示例:
- name: Setup Android signing
run: |
cd src-tauri/gen/android
echo "keyAlias=${{ secrets.ANDROID_KEY_ALIAS }}" > keystore.properties
echo "password=${{ secrets.ANDROID_KEY_PASSWORD }}" >> keystore.properties
base64 -d <<< "${{ secrets.ANDROID_KEY_BASE64 }}" > $RUNNER_TEMP/keystore.jks
echo "storeFile=$RUNNER_TEMP/keystore.jks" >> keystore.properties
iOS 签名
前提条件
- 加入 Apple Developer Program(每年 $99)
- 已在 App Store Connect 注册的 Bundle ID
- iOS 代码签名证书
- 移动配置描述文件
自动签名(推荐)
本地开发时,通过 Xcode Settings > Accounts 进行身份验证。
CI/CD 中,创建 App Store Connect API 密钥并设置:
| 变量 | 描述 |
|---|---|
APPLE_API_ISSUER | App Store Connect 中的 Issuer ID |
APPLE_API_KEY | App Store Connect 中的 Key ID |
APPLE_API_KEY_PATH | .p8 私钥文件的路径 |
手动签名
| 变量 | 描述 |
|---|---|
IOS_CERTIFICATE | Base64 编码的 .p12 证书 |
IOS_CERTIFICATE_PASSWORD | 导出证书时使用的密码 |
IOS_MOBILE_PROVISION | Base64 编码的配置描述文件 |
不同分发方式对应的证书类型
| 分发方式 | 证书类型 |
|---|---|
| 调试 | Apple Development 或 iOS App Development |
| App Store | Apple Distribution 或 iOS Distribution |
| Ad Hoc | Apple Distribution 或 iOS Distribution |
导出证书
- 打开 Keychain Access
- 找到你的证书
- 右键点击私钥
- 选择“导出”并保存为
.p12 - 转换为 base64:
base64 -i certificate.p12
创建配置描述文件
- 注册与 Bundle ID 匹配的 App ID
- 为你的分发方式创建配置描述文件
- 将证书关联到配置描述文件
- 下载并转换:
base64 -i profile.mobileprovision
Linux 签名(AppImage)
生成 GPG 密钥
gpg2 --full-gen-key
请安全备份此密钥。
环境变量
| 变量 | 描述 |
|---|---|
SIGN | 设置为 1 以启用签名 |
SIGN_KEY | GPG 密钥 ID(可选;未设置时使用默认值) |
APPIMAGETOOL_SIGN_PASSPHRASE | 密钥密码(CI/CD 必需) |
APPIMAGETOOL_FORCE_SIGN | 设置为 1,签名出错时使构建失败 |
使用签名进行构建
SIGN=1 APPIMAGETOOL_SIGN_PASSPHRASE="your-passphrase" npm run tauri build
查看嵌入的签名
./src-tauri/target/release/bundle/appimage/app_version_amd64.AppImage --appimage-signature
验证签名
从 AppImageUpdate releases 下载验证工具:
chmod +x validate-x86_64.AppImage
./validate-x86_64.AppImage your-app.AppImage
注意: AppImage 不会自动验证签名。用户必须手动验证。
macOS 签名与公证
前提条件
- 加入 Apple Developer Program(每年 $99)
- 用于代码签名的 Mac 电脑
- 免费账户无法为应用进行公证
证书类型
| 证书 | 使用场景 |
|---|---|
| Apple Distribution | 提交到 App Store |
| Developer ID Application | 在 App Store 之外分发 |
创建证书
- 在钥匙串访问中生成证书签名请求(CSR)
- 将 CSR 上传到 Apple Developer > Certificates, IDs & Profiles
- 下载并双击
.cer以安装
配置
tauri.conf.json:
{
"bundle": {
"macOS": {
"signingIdentity": "Developer ID Application: Your Name (TEAM_ID)"
}
}
}
CI/CD 环境变量
证书变量:
| 变量 | 说明 |
|---|---|
APPLE_CERTIFICATE | Base64 编码的 .p12 证书 |
APPLE_CERTIFICATE_PASSWORD | 导出证书的密码 |
APPLE_SIGNING_IDENTITY | 钥匙串中的证书名称 |
公证 - 选项 1:App Store Connect API(推荐):
| 变量 | 说明 |
|---|---|
APPLE_API_ISSUER | 颁发者 ID |
APPLE_API_KEY | 密钥 ID |
APPLE_API_KEY_PATH | .p8 私钥的路径 |
公证 - 选项 2:Apple ID:
| 变量 | 说明 |
|---|---|
APPLE_ID | Apple ID 邮箱 |
APPLE_PASSWORD | App 专用密码 |
APPLE_TEAM_ID | 团队标识符 |
为 CI/CD 导出证书
# Export from Keychain as .p12, then:
base64 -i certificate.p12 | pbcopy
临时签名(仅用于测试)
对于未签名分发,或不使用 Apple 凭据进行测试:
{
"bundle": {
"macOS": {
"signingIdentity": "-"
}
}
}
GitHub Actions 示例
- name: Import certificate
env:
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
run: |
echo $APPLE_CERTIFICATE | base64 --decode > certificate.p12
security create-keychain -p actions temp.keychain
security import certificate.p12 -k temp.keychain -P $APPLE_CERTIFICATE_PASSWORD -T /usr/bin/codesign
security list-keychains -s temp.keychain
security unlock-keychain -p actions temp.keychain
security set-key-partition-list -S apple-tool:,apple: -s -k actions temp.keychain
Windows 签名
证书类型
| 类型 | SmartScreen | 可用时间 |
|---|---|---|
| OV(组织验证) | 随时间积累信誉 | 2023 年 6 月 1 日之前 |
| EV(扩展验证) | 立即获得信任 | 2023 年 6 月 1 日之后需要 |
注意: 2023 年 6 月 1 日之后获取的证书,需要使用 EV 证书才能立即获得 SmartScreen 信任。
配置
tauri.conf.json:
{
"bundle": {
"windows": {
"certificateThumbprint": "A1B1A2B2A3B3A4B4A5B5A6B6A7B7A8B8A9B9A0B0",
"digestAlgorithm": "sha256",
"timestampUrl": "http://timestamp.sectigo.com"
}
}
}
查找证书指纹
- 打开证书详细信息
- 前往“详细信息”选项卡
- 找到“指纹”字段
- 复制十六进制字符串(移除空格)
常用时间戳 URL
http://timestamp.sectigo.comhttp://timestamp.digicert.comhttp://timestamp.globalsign.com
将证书转换为 PFX
openssl pkcs12 -export -in cert.cer -inkey private-key.key -out certificate.pfx
CI/CD 环境变量
| 变量 | 说明 |
|---|---|
WINDOWS_CERTIFICATE | Base64 编码的 .pfx 文件 |
WINDOWS_CERTIFICATE_PASSWORD | PFX 导出密码 |
GitHub Actions 示例
- name: Import Windows certificate
env:
WINDOWS_CERTIFICATE: ${{ secrets.WINDOWS_CERTIFICATE }}
WINDOWS_CERTIFICATE_PASSWORD: ${{ secrets.WINDOWS_CERTIFICATE_PASSWORD }}
run: |
echo "$WINDOWS_CERTIFICATE" | base64 --decode > certificate.pfx
Import-PfxCertificate -FilePath certificate.pfx -CertStoreLocation Cert:\CurrentUser\My -Password (ConvertTo-SecureString -String $env:WINDOWS_CERTIFICATE_PASSWORD -AsPlainText -Force)
shell: pwsh
Azure Key Vault 签名
使用 Azure Key Vault 进行云端签名:
| 变量 | 说明 |
|---|---|
AZURE_CLIENT_ID | Azure AD 应用程序客户端 ID |
AZURE_CLIENT_SECRET | Azure AD 应用程序密钥 |
AZURE_TENANT_ID | Azure AD 租户 ID |
在 tauri.conf.json 中配置:
{
"bundle": {
"windows": {
"signCommand": "relic sign --key azurekeyvault --file %1"
}
}
}
Azure Trusted Signing
使用 Azure Code Signing 服务:
{
"bundle": {
"windows": {
"signCommand": "trusted-signing-cli -e <endpoint> -a <account> -c <profile> %1"
}
}
}
自定义签名命令
用于其他签名工具或跨平台构建:
{
"bundle": {
"windows": {
"signCommand": "your-signing-tool --sign %1"
}
}
}
%1 占位符会替换为可执行文件路径。
快速参考:所有环境变量
Android
ANDROID_KEY_ALIASANDROID_KEY_PASSWORDANDROID_KEY_BASE64
iOS(手动)
IOS_CERTIFICATEIOS_CERTIFICATE_PASSWORDIOS_MOBILE_PROVISION
iOS/macOS(API 密钥)
APPLE_API_ISSUERAPPLE_API_KEYAPPLE_API_KEY_PATH
macOS(证书)
APPLE_CERTIFICATEAPPLE_CERTIFICATE_PASSWORDAPPLE_SIGNING_IDENTITY
macOS(Apple ID 公证)
APPLE_IDAPPLE_PASSWORDAPPLE_TEAM_ID
Linux
SIGNSIGN_KEYAPPIMAGETOOL_SIGN_PASSPHRASEAPPIMAGETOOL_FORCE_SIGN
Windows
WINDOWS_CERTIFICATEWINDOWS_CERTIFICATE_PASSWORD
Azure(Windows)
AZURE_CLIENT_IDAZURE_CLIENT_SECRETAZURE_TENANT_ID