Windows 代码签名
在 Windows 上,要将你的应用列在 Microsoft Store 中,并防止从浏览器下载时出现 SmartScreen 警告(提示你的应用不受信任且无法启动),代码签名是必需的。
只要你的最终用户可以接受忽略 SmartScreen 警告,或者你的用户不是通过浏览器下载,那么在 Windows 上执行你的应用不是必需的代码签名。本指南涵盖通过 OV(组织验证)证书和 Azure 密钥库进行签名。如果你使用此处未记录的任何其他签名机制(例如 EV(扩展验证)证书),请查看你的证书颁发者文档并参考自定义签名命令部分。
OV 证书
准备工作
- Windows - 你可能可以使用其他平台,但本教程使用 Powershell 原生功能。
- 一个可用的 Tauri 应用程序
- 代码签名证书 - 你可以在Microsoft 的文档中列出的服务上获取一个证书。可能还有其他非 EV 证书的颁发机构未包含在该列表中,请自行比较并自行承担风险选择。
- 请确保获取代码签名证书,SSL 证书不起作用!
开始入门
我们需要做一些事情来为 Windows 准备代码签名。这包括将我们的证书转换为特定格式,安装此证书,以及从证书中解码所需的信息。
-
将你的
.cer
转换为.pfx
-
你将需要以下内容
- 证书文件(我的文件是
cert.cer
) - 私钥文件(我的文件是
private-key.key
)
- 证书文件(我的文件是
-
打开命令提示符,并使用
cd Documents/Certs
切换到你的当前目录 -
使用
openssl pkcs12 -export -in cert.cer -inkey private-key.key -out certificate.pfx
将你的.cer
转换为.pfx
-
你应该被提示输入导出密码 不要忘记它!
-
-
将你的
.pfx
文件导入到密钥库中。-
我们现在需要导入我们的
.pfx
文件。 -
使用
$WINDOWS_PFX_PASSWORD = 'MYPASSWORD'
将你的导出密码分配给一个变量 -
现在使用
Import-PfxCertificate -FilePath certificate.pfx -CertStoreLocation Cert:\CurrentUser\My -Password (ConvertTo-SecureString -String $WINDOWS_PFX_PASSWORD -Force -AsPlainText)
导入证书
-
-
准备变量
-
开始 ➡️
certmgr.msc
打开个人证书管理,然后打开个人/证书。 -
找到我们刚刚导入的证书并双击它,然后单击“详细信息”选项卡。
-
签名哈希算法将是我们的
digestAlgorithm
。(提示:这很可能是sha256
) -
向下滚动到“指纹”。应该有一个像
A1B1A2B2A3B3A4B4A5B5A6B6A7B7A8B8A9B9A0B0
这样的值。这是我们的certificateThumbprint
。 -
我们还需要一个时间戳 URL;这是一个用于验证证书签名时间的时间服务器。我正在使用
http://timestamp.comodoca.com
,但是你的证书颁发者可能也有一个。
-
准备 tauri.conf.json
文件
-
现在我们有了
certificateThumbprint
、digestAlgorithm
和timestampUrl
,我们将打开tauri.conf.json
。 -
在
tauri.conf.json
中,你将查找tauri
->bundle
->windows
部分。有三个变量用于我们捕获的信息。像下面这样填写。
"windows": { "certificateThumbprint": "A1B1A2B2A3B3A4B4A5B5A6B6A7B7A8B8A9B9A0B0", "digestAlgorithm": "sha256", "timestampUrl": "http://timestamp.comodoca.com"}
-
保存并运行
tauri build
-
在控制台输出中,你应该看到以下输出。
info: signing appinfo: running signtool "C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.19041.0\\x64\\signtool.exe"info: "Done Adding Additional Store\r\nSuccessfully signed: APPLICATION FILE PATH HERE
这表明你已成功签署了 .exe
。
就是这样!你已成功为 Windows 签名设置了你的 Tauri 应用程序。
使用 GitHub Actions 签署你的应用。
我们还可以创建一个工作流程,以使用 GitHub Actions 签署应用程序。
GitHub 密钥
我们需要添加一些 GitHub 密钥,以正确配置 GitHub Action。这些可以随意命名。
- 你可以查看加密密钥指南,了解如何添加 GitHub 密钥。
我们使用的密钥如下
GitHub 密钥 | 变量的值 |
---|---|
WINDOWS_CERTIFICATE | 你的 .pfx 证书的 Base64 编码版本,可以使用此命令完成:certutil -encode certificate.pfx base64cert.txt |
WINDOWS_CERTIFICATE_PASSWORD | 在创建证书 .pfx 时使用的证书导出密码 |
工作流程修改
-
我们需要在工作流程中添加一个步骤,将证书导入到 Windows 环境中。此工作流程完成以下操作
- 将 GitHub 密钥分配给环境变量
- 创建一个新的
certificate
目录 - 将
WINDOWS_CERTIFICATE
导入到 tempCert.txt - 使用
certutil
将 tempCert.txt 从 base64 解码为.pfx
文件。 - 删除 tempCert.txt
- 将
.pfx
文件导入到 Windows 的证书存储中,并将WINDOWS_CERTIFICATE_PASSWORD
转换为安全字符串,以便在导入命令中使用。
-
我们将使用
tauri-action
发布模板。
name: 'publish'on: push: branches: - release
jobs: publish-tauri: strategy: fail-fast: false matrix: platform: [macos-latest, ubuntu-latest, windows-latest]
runs-on: ${{ matrix.platform }} steps: - uses: actions/checkout@v2 - name: setup node uses: actions/setup-node@v1 with: node-version: 12 - name: install Rust stable uses: actions-rs/toolchain@v1 with: toolchain: stable - name: install webkit2gtk (ubuntu only) if: matrix.platform == 'ubuntu-latest' run: | sudo apt-get update sudo apt-get install -y webkit2gtk-4.0 - name: install app dependencies and build it run: yarn && yarn build - uses: tauri-apps/tauri-action@v0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 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
- 在
-name: install app dependencies and build it
的正上方,你将要添加以下步骤
- 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 -include tempCert.txt Import-PfxCertificate -FilePath certificate/certificate.pfx -CertStoreLocation Cert:\CurrentUser\My -Password (ConvertTo-SecureString -String $env:WINDOWS_CERTIFICATE_PASSWORD -Force -AsPlainText)
-
保存并推送到你的仓库。
-
你的工作流程现在可以导入你的 Windows 证书并将其导入到 GitHub Runner 中,从而实现自动代码签名!
Azure 密钥库
你可以通过提供 Azure 密钥库证书和凭据来签署 Windows 可执行文件。
- 密钥库
在 Azure 门户中,导航到密钥库服务以通过单击“创建”按钮来创建一个新的密钥库。记住“密钥库名称”,因为你需要该信息来配置证书 URL。
- 证书
创建密钥库后,选择它并转到“对象 > 证书”页面以创建一个新证书,然后单击“生成/导入”按钮。记住“证书名称”,因为你需要该信息来配置证书 URL。
- Tauri 配置
relic 使用配置文件来确定它应该使用哪个签名密钥。对于 Azure 密钥库,你还需要证书 URL。在 src-tauri
文件夹中创建一个 relic.conf
文件,并配置 relic 以使用你的证书
tokens: azure: type: azure
keys: azure: token: azure id: https://\<KEY_VAULT_NAME\>.vault.azure.net/certificates/\<CERTIFICATE_NAME\>
请注意,你必须将 <KEY_VAULT_NAME> 和 <CERTIFICATE_NAME> 替换为前面步骤中的相应名称。
要配置 Tauri 以使用你的 Azure 密钥库配置进行签名,请更改bundle > windows > signCommand 配置值
{ "bundle": { "windows": { "signCommand": "relic sign --file %1 --key azure --config relic.conf" } }}
- 凭据
relic 必须使用 Azure 进行身份验证才能加载证书。在 Azure 门户登录页面中,转到“Microsoft Entra ID”服务,然后转到“管理 > 应用注册”页面。单击“新注册”以创建一个新的应用。创建应用后,你将被重定向到应用程序详细信息页面,你可以在其中看到“应用程序(客户端)ID”和“目录(租户)ID”值。将这些 ID 分别设置为 AZURE_CLIENT_ID
和 AZURE_TENANT_ID
环境变量。
在“管理 > 证书和密钥”页面中,单击“新客户端密钥”按钮,并将“值”列中的文本设置为 AZURE_CLIENT_SECRET
环境变量。
设置完所有凭据后,返回到你的密钥库页面,并导航到“访问控制 (IAM)”页面。你必须将“密钥库证书用户”和“密钥库加密用户”角色分配给你的新创建的应用程序。
设置完所有这些变量后,运行 tauri build
将生成已签名的 Windows 安装程序!
自定义签名命令
在上面的Azure 密钥库文档中,我们使用了一个强大的 Tauri Windows 签名配置,以强制 Tauri CLI 使用特殊的 shell 命令来签署 Windows 安装程序可执行文件。bundle > windows > signCommand
配置选项可用于使用任何可以签署 Windows 可执行文件的代码签名工具。
Azure 代码签名
你可以通过提供 Azure 代码签名证书和凭据来签署 Windows 可执行文件。如果你还没有 Azure 代码签名帐户,你可以按照本教程进行操作。
准备工作
如果你想使用 Github Actions 进行签名,则应安装所有内容。
开始入门
你需要安装 trusted-signing-cli 并配置你的环境变量。
-
安装 trusted-signing-cli
cargo install trusted-signing-cli
-
配置环境变量
-
修改你的
tauri.conf.json
文件-
你可以修改你的
tauri.conf.json
,或者你可以为 Windows 创建一个特定的配置文件。将 URL 和证书名称替换为你自己的值。- -e:你的 Azure 代码签名帐户的端点
- -a:你的 Azure 代码签名帐户的名称
- -c:你的 Azure 代码签名帐户中的证书配置文件的名称
- -d:已签名内容的描述(可选)。当签署 .msi 安装程序时,此描述将作为安装程序的名称出现在 UAC 提示符中,如果未设置,则将是一个随机字符串。
tauri.conf.json {"bundle": {"windows": {"signCommand": "trusted-signing-cli -e https://wus2.codesigning.azure.net -a MyAccount -c MyProfile -d MyApp %1"}}} -
© 2025 Tauri 贡献者。CC-BY / MIT