mcpField
S
signing-tauri-apps

signing-tauri-apps

github.com/dchuk安全36179 次安装40 周前更新
代码仓库

关于 signing-tauri-apps

面向 Tauri 应用开发者的跨平台代码签名指南,覆盖 Android、iOS、Linux、macOS 和 Windows。内容包括证书配置、CI/CD 环境变量以及 macOS 公证和 Windows 云端签名。

主要功能

  1. 01覆盖五个平台的签名流程
  2. 02配置证书与签名身份
  3. 03准备 CI/CD 签名环境变量
  4. 04处理 macOS 公证
  5. 05配置 Windows 自定义签名命令
  6. 06验证 Linux AppImage 签名

适用场景

  1. 01为应用商店发布准备 Android 或 iOS 签名
  2. 02配置 macOS 应用签名与公证
  3. 03为 Windows 构建设置证书签名
  4. 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_PASSWORDKeystore 密码
ANDROID_KEY_BASE64Base64 编码的 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_ISSUERApp Store Connect 中的 Issuer ID
APPLE_API_KEYApp Store Connect 中的 Key ID
APPLE_API_KEY_PATH.p8 私钥文件的路径
手动签名
变量描述
IOS_CERTIFICATEBase64 编码的 .p12 证书
IOS_CERTIFICATE_PASSWORD导出证书时使用的密码
IOS_MOBILE_PROVISIONBase64 编码的配置描述文件
不同分发方式对应的证书类型
分发方式证书类型
调试Apple Development 或 iOS App Development
App StoreApple Distribution 或 iOS Distribution
Ad HocApple Distribution 或 iOS Distribution
导出证书
  1. 打开 Keychain Access
  2. 找到你的证书
  3. 右键点击私钥
  4. 选择“导出”并保存为 .p12
  5. 转换为 base64:base64 -i certificate.p12
创建配置描述文件
  1. 注册与 Bundle ID 匹配的 App ID
  2. 为你的分发方式创建配置描述文件
  3. 将证书关联到配置描述文件
  4. 下载并转换:base64 -i profile.mobileprovision

Linux 签名(AppImage)

生成 GPG 密钥
gpg2 --full-gen-key

请安全备份此密钥。

环境变量
变量描述
SIGN设置为 1 以启用签名
SIGN_KEYGPG 密钥 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 之外分发
创建证书
  1. 在钥匙串访问中生成证书签名请求(CSR)
  2. 将 CSR 上传到 Apple Developer > Certificates, IDs & Profiles
  3. 下载并双击 .cer 以安装
配置

tauri.conf.json:

{
  "bundle": {
    "macOS": {
      "signingIdentity": "Developer ID Application: Your Name (TEAM_ID)"
    }
  }
}
CI/CD 环境变量

证书变量:

变量说明
APPLE_CERTIFICATEBase64 编码的 .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_IDApple ID 邮箱
APPLE_PASSWORDApp 专用密码
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"
    }
  }
}
查找证书指纹
  1. 打开证书详细信息
  2. 前往“详细信息”选项卡
  3. 找到“指纹”字段
  4. 复制十六进制字符串(移除空格)
常用时间戳 URL
  • http://timestamp.sectigo.com
  • http://timestamp.digicert.com
  • http://timestamp.globalsign.com
将证书转换为 PFX
openssl pkcs12 -export -in cert.cer -inkey private-key.key -out certificate.pfx
CI/CD 环境变量
变量说明
WINDOWS_CERTIFICATEBase64 编码的 .pfx 文件
WINDOWS_CERTIFICATE_PASSWORDPFX 导出密码
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_IDAzure AD 应用程序客户端 ID
AZURE_CLIENT_SECRETAzure AD 应用程序密钥
AZURE_TENANT_IDAzure 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_ALIAS
  • ANDROID_KEY_PASSWORD
  • ANDROID_KEY_BASE64
iOS(手动)
  • IOS_CERTIFICATE
  • IOS_CERTIFICATE_PASSWORD
  • IOS_MOBILE_PROVISION
iOS/macOS(API 密钥)
  • APPLE_API_ISSUER
  • APPLE_API_KEY
  • APPLE_API_KEY_PATH
macOS(证书)
  • APPLE_CERTIFICATE
  • APPLE_CERTIFICATE_PASSWORD
  • APPLE_SIGNING_IDENTITY
macOS(Apple ID 公证)
  • APPLE_ID
  • APPLE_PASSWORD
  • APPLE_TEAM_ID
Linux
  • SIGN
  • SIGN_KEY
  • APPIMAGETOOL_SIGN_PASSPHRASE
  • APPIMAGETOOL_FORCE_SIGN
Windows
  • WINDOWS_CERTIFICATE
  • WINDOWS_CERTIFICATE_PASSWORD
Azure(Windows)
  • AZURE_CLIENT_ID
  • AZURE_CLIENT_SECRET
  • AZURE_TENANT_ID

评论

支持 Markdown