跳至主要内容

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 Secrets

我们需要添加一些 GitHub Secrets 来正确配置 GitHub Action。 这些可以根据你的喜好命名。

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

我们使用的 secrets 如下

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

工作流修改

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

    1. 将 GitHub Secrets 分配给环境变量
    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 runner,从而实现自动代码签名!