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

简介

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

危险

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

前提条件

  • Windows - 您可以使用其他平台,但本教程使用 Powershell 本机功能。
  • 可运行的Tauri应用程序
  • 代码签名证书--您可以从微软文档中列出的服务机构获取。除了该列表中列出的机构外,可能还有其他非 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. 现在我们有了certificateThumbprint(证书指纹)、digestAlgorithm(摘要算法)和 timestampUrl(时间戳url),我们将打开 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 操作。这些密钥可以随意命名。

有关如何添加 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 运行程序,从而实现自动代码签名!