跳至主要内容

Windows - 本地和 GitHub Actions 代码签名指南

简介

对应用程序进行代码签名可让用户知道他们下载的是应用程序的官方可执行文件,而不是冒充应用程序的第三方恶意软件。虽然这不是必需的,但它可以提高用户对应用程序的信心。

危险

本指南仅适用于在 2023 年 6 月 1 日之前获取的 OV 代码签名证书!对于使用 EV 证书和在该日期之后收到的 OV 证书进行代码签名,请查阅证书颁发机构的文档。

先决条件

  • Windows - 你可能可以使用其他平台,但本教程使用的是 Powershell 原生功能。
  • 一个可用的 Tauri 应用程序
  • 代码签名证书 - 你可以在 Microsoft 文档 中列出的服务中获取其中一个。除了该列表中包含的非 EV 证书,可能还有其他颁发机构,请自行比较并自行选择。
    • 请务必获取代码签名证书,SSL 证书不起作用!

本指南假设您拥有标准代码签名证书>如果您拥有 EV 证书,通常涉及硬件令牌,请按照发行者的文档进行操作。

注意

如果您使用 EV 证书对应用进行签名,它将立即获得 Microsoft SmartScreen 的声誉,并且不会向用户显示任何警告。

如果您选择 OV 证书(通常更便宜,并且个人可以使用),Microsoft SmartScreen 在用户下载应用时仍会向用户显示警告。您的证书建立足够声誉可能需要一些时间。您可以选择向 Microsoft 提交您的应用以进行人工审查。尽管无法保证,但如果应用不包含任何恶意代码,Microsoft 可能会授予额外的声誉,并可能删除针对该特定上传文件的警告。

开始

我们需要做一些事情来让 Windows 为代码签名做好准备。这包括将我们的证书转换为特定格式、安装此证书以及从证书解码所需的信息。

A. 将您的 .cer 转换为 .pfx

  1. 您将需要以下内容

    • 证书文件(我的文件是 cert.cer
    • 私钥文件(我的文件是 private-key.key
  2. 打开命令提示符,并使用 cd Documents/Certs 更改到当前目录

  3. 使用 openssl pkcs12 -export -in cert.cer -inkey private-key.key -out certificate.pfx 将您的 .cer 转换为 .pfx

  4. 系统会提示您输入导出密码请记住它!

B. 将您的 .pfx 文件导入密钥库。

我们现在需要导入我们的 .pfx 文件。

  1. 使用 $WINDOWS_PFX_PASSWORD = 'MYPASSWORD' 将您的导出密码分配给一个变量

  2. 现在使用 Import-PfxCertificate -FilePath certificate.pfx -CertStoreLocation Cert:\CurrentUser\My -Password (ConvertTo-SecureString -String $WINDOWS_PFX_PASSWORD -Force -AsPlainText) 导入证书

C. 准备变量

  1. 启动 ➡️ certmgr.msc 以打开个人证书管理,然后打开个人/证书。

  2. 找到我们刚刚导入的证书并双击它,然后单击详细信息选项卡。

  3. 签名哈希算法将是我们的 digestAlgorithm。(提示:这可能是 sha256

  4. 向下滚动到指纹。应该有一个值,如 A1B1A2B2A3B3A4B4A5B5A6B6A7B7A8B8A9B9A0B0。这是我们的 certificateThumbprint

  5. 我们还需要一个时间戳 URL;这是一个时间服务器,用于验证证书签名的日期。我使用的是 http://timestamp.comodoca.com,但无论你从谁那里获得证书,他们可能也有一个。

准备 tauri.conf.json 文件

  1. 现在我们有了 certificateThumbprintdigestAlgorithmtimestampUrl,我们将打开 tauri.conf.json

  2. tauri.conf.json 中,你将寻找 tauri -> bundle -> windows 部分。你看,我们捕获的信息有三个变量。像下面这样填写它。

"windows": {
"certificateThumbprint": "A1B1A2B2A3B3A4B4A5B5A6B6A7B7A8B8A9B9A0B0",
"digestAlgorithm": "sha256",
"timestampUrl": "http://timestamp.comodoca.com"
}
  1. 保存并运行 yarn | yarn build

  2. 在控制台输出中,你应该看到以下输出。

info: signing app
info: 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

就是这样!你已成功签署你的 .exe 文件。

额外奖励:使用 GitHub Actions 签署你的应用程序。

我们还可以创建一个工作流,使用 GitHub Actions 签署应用程序。

GitHub 秘钥

我们需要添加一些 GitHub 秘钥,以便正确配置 GitHub Action。你可以根据需要对这些秘钥进行命名。

  • 你可以查看加密秘钥指南,了解如何添加 GitHub 秘钥。

我们使用的秘钥如下

GitHub 密钥变量值
WINDOWS_CERTIFICATE你的 .pfx 证书的 Base64 编码版本,可以使用以下命令完成:certutil -encode certificate.pfx base64cert.txt
WINDOWS_CERTIFICATE_PASSWORD创建证书 .pfx 时使用的证书导出密码

工作流修改

  1. 我们需要在工作流中添加一个步骤,以将证书导入 Windows 环境。此工作流完成以下操作

    1. 将 GitHub 密钥分配给环境变量
    2. 创建新的 certificate 目录
    3. WINDOWS_CERTIFICATE 导入 tempCert.txt
    4. 使用 certutil 将 tempCert.txt 从 base64 解码为 .pfx 文件。
    5. 删除 tempCert.txt
    6. .pfx 文件导入 Windows 的证书存储,并将 WINDOWS_CERTIFICATE_PASSWORD 转换为安全字符串,以便在导入命令中使用。
  2. 我们将使用 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
  1. -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)
  1. 保存并推送到你的仓库。

  2. 你的工作流现在可以导入你的 Windows 证书并将其导入 GitHub 运行程序,从而实现自动代码签名!