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
-
您需要以下材料
- 证书文件(我的是
cert.cer
) - 私钥文件(我的是
private-key.key
)
- 证书文件(我的是
-
打开命令提示符,使用
cd Documents/Certs
切换到当前目录 -
使用
openssl pkcs12 -export -in cert.cer -inkey private-key.key -out certificate.pfx
将.cer
转换为.pfx
-
系统会提示您输入导出密码,不要忘记!
B. 将 .pfx
文件导入密钥库。
现在我们需要导入 .pfx
文件。
-
使用
$WINDOWS_PFX_PASSWORD = 'MYPASSWORD'
将您的导出密码分配给一个变量 -
现在使用
Import-PfxCertificate -FilePath certificate.pfx -CertStoreLocation Cert:\CurrentUser\My -Password (ConvertTo-SecureString -String $WINDOWS_PFX_PASSWORD -Force -AsPlainText)
导入证书。
C. 准备变量
-
启动 ➡️
certmgr.msc
打开个人证书管理,然后打开个人/证书。 -
找到我们刚刚导入的证书并双击它,然后点击 "详细信息 "选项卡。
-
签名哈希算法将是我们的
digestAlgorithm
。(提示:可能是sha256
) -
向下滚动到拇指指纹。应该有一个类似
A1B1A2B2A3B3A4B4A5B5A6B6A7B7A8B8A9B9A0B0
的值。这就是我们的certificateThumbprint
(证书指纹)。 -
我们还需要一个时间戳 URL;这是用于验证证书签署时间的时间服务器。我使用的是
http://timestamp.comodoca.com
,但无论你从谁那里获得证书,都可能有一个时间戳。
准备 tauri.conf.json
文件
-
现在我们有了
certificateThumbprint
(证书指纹)、digestAlgorithm
(摘要算法)和 timestampUrl(时间戳url),我们将打开tauri.conf.json
。 -
在
tauri.conf.json
中,你可以找到tauri
->bundle
->windows
部分。你会看到,有三个变量代表我们捕获的信息。填写如下。
"windows": {
"certificateThumbprint": "A1B1A2B2A3B3A4B4A5B5A6B6A7B7A8B8A9B9A0B0",
"digestAlgorithm": "sha256",
"timestampUrl": "http://timestamp.comodoca.com"
}
-
保存并运行
yarn | yarn build
-
在控制台输出中,您应该看到以下输出。
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 时使用的证书导出密码 |
工作流程修改
-
我们需要在工作流程中添加一个步骤,将证书导入 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 运行程序,从而实现自动代码签名!