跳至主要内容

CI/CD 與構建工具

sslTrus 遠端程式碼簽章服務可以整合到 CI/CD、應用程式建置與安裝包製作流程中,在編譯或打包完成後自動對發布產物執行程式碼簽章。

當前支援的典型整合情境包括:

  • GitHub Actions
  • Electron Builder
  • Advanced Installer

根據建置工具的能力,可以直接使用 sslTrus GitHub Action、呼叫 SignTool CLI,或透過建置工具提供的自訂簽章介面完成整合。

GitHub Actions

sslTrus 提供官方 GitHub Action:

ssltrus-official/code-sign-action

可以直接在 GitHub Actions Workflow 中對建置產物執行遠端程式碼簽署。

Action 會呼叫 sslTrus 遠端程式碼簽署服務完成簽署,並直接更新指定檔案,適用於 Linux、macOS 和 Windows Runner。

準備 GitHub Secrets

建議將遠端程式碼簽署憑證儲存到 GitHub Actions Secrets:

SSLTRUS_ACCESS_KEY
SSLTRUS_ACCESS_SECRET
SSLTRUS_CERT_CODE

不要將 Access Secret 直接寫入 Workflow 檔案。

基礎配置

- name: Sign files
uses: ssltrus-official/code-sign-action@v1
with:
access-key: ${{ secrets.SSLTRUS_ACCESS_KEY }}
access-secret: ${{ secrets.SSLTRUS_ACCESS_SECRET }}
cert-code: ${{ secrets.SSLTRUS_CERT_CODE }}
files: build/app.exe

簽署成功後,build/app.exe 會被簽署後的檔案直接取代。

簽署多個檔案

files 支援使用多行設定多個檔案:

- name: Sign files
uses: ssltrus-official/code-sign-action@v1
with:
access-key: ${{ secrets.SSLTRUS_ACCESS_KEY }}
access-secret: ${{ secrets.SSLTRUS_ACCESS_SECRET }}
cert-code: ${{ secrets.SSLTRUS_CERT_CODE }}
files: |
build/app.exe
build/library.dll
build/installer.msi

也可以使用逗號分隔檔案路徑。

重複的檔案路徑只會處理一次。

完整設定

- name: Sign files
uses: ssltrus-official/code-sign-action@v1
with:
access-key: ${{ secrets.SSLTRUS_ACCESS_KEY }}
access-secret: ${{ secrets.SSLTRUS_ACCESS_SECRET }}
cert-code: ${{ secrets.SSLTRUS_CERT_CODE }}
files: |
build/app.exe
build/library.dll
build/installer.msi
dry-run: false
timestamp-rfc3161: http://timestamp.acs.microsoft.com
description: Example Application
description-url: https://example.com

主要參數:

參數必填預設值說明
access-key-sslTrus Access Key
access-secret-sslTrus Access Secret
cert-code-程式碼簽署憑證編號
files-需要簽署的檔案路徑
nicsrsfalse是否使用 NICSRS 服務
dry-runfalse使用本機測試憑證執行測試簽署
timestamp-rfc3161autoRFC 3161 時間戳伺服器
description-寫入 Authenticode 簽章的程式描述
description-url-寫入 Authenticode 簽章的程式 URL

完整 Workflow 範例

下面是在 Windows Runner 中編譯、簽章並上傳建置產物的範例:

name: Build and Sign

on:
workflow_dispatch:

permissions:
contents: read

jobs:
build:
runs-on: windows-latest

steps:
- name: Check out repository
uses: actions/checkout@v7

- name: Build
run: |
# 在这里执行实际构建命令

- name: Sign files
uses: ssltrus-official/code-sign-action@v1
with:
access-key: ${{ secrets.SSLTRUS_ACCESS_KEY }}
access-secret: ${{ secrets.SSLTRUS_ACCESS_SECRET }}
cert-code: ${{ secrets.SSLTRUS_CERT_CODE }}
files: |
build/app.exe
build/library.dll
timestamp-rfc3161: http://timestamp.acs.microsoft.com

- name: Upload signed files
uses: actions/upload-artifact@v7
with:
name: signed-files
path: |
build/app.exe
build/library.dll

建議將簽署步驟放在:

編譯 → 打包 → 程式碼簽署 → 發佈

流程中的發佈步驟之前。

多平台 Runner

GitHub Action 可以在不同 Runner 中調用:

strategy:
matrix:
os:
- ubuntu-latest
- macos-latest
- windows-latest

runs-on: ${{ matrix.os }}

因此,即使建置工作執行於 Linux 或 macOS,也可以使用相同 Action 完成受支援檔案的遠端簽署。

Dry Run

如果需要驗證 Workflow 和檔案處理邏輯,可以啟用:

dry-run: true

此模式使用本機測試憑證,不呼叫遠端程式碼簽署服務。

例如:

- name: Test signing
uses: ssltrus-official/code-sign-action@v1
with:
access-key: dummy
access-secret: dummy
cert-code: dummy
files: build/app.exe
dry-run: true

dry-run 仍會修改目標檔案,因此不要將其理解為完全不修改檔案的預覽模式。

Electron Builder

Electron Builder 可以透過自訂簽章函式呼叫 sslTrus SignTool CLI,從而在 Electron 應用程式建置過程中自動完成 Windows 可執行檔與安裝套件簽章。

典型流程:

Electron Builder

customSign

SignTool CLI

sslTrus 远程代码签名服务

云端 HSM

前提條件

開始前需要:

  • 已有可用的 sslTrus 遠端程式碼簽章服務。
  • 已取得 Access Key 和 Access Secret。
  • 已取得程式碼簽章憑證編號。
  • Electron 專案使用 electron-builder 建置。
  • 建置環境能夠執行 sslTrus SignTool CLI,可從 sslTrus 用戶端發佈頁 下載。

設定憑證

可以透過環境變數將憑證傳遞給建置指令碼:

Linux 和 macOS:

export SIGNTOOL_ACCESS_KEY="YOUR_ACCESS_KEY"
export SIGNTOOL_ACCESS_SECRET="YOUR_ACCESS_SECRET"
export SIGNTOOL_CERT_CODE="YOUR_CERT_CODE"

Windows PowerShell:

$env:SIGNTOOL_ACCESS_KEY = "YOUR_ACCESS_KEY"
$env:SIGNTOOL_ACCESS_SECRET = "YOUR_ACCESS_SECRET"
$env:SIGNTOOL_CERT_CODE = "YOUR_CERT_CODE"

這些變數由 Electron 自訂簽署腳本讀取,再傳遞給 SignTool CLI。

設定 Electron Builder

在:

electron-builder.mjs

或者專案實際使用的 Electron Builder 設定檔中,為 Windows 設定自訂簽章函式:

export default {
win: {
target: [
{
target: 'nsis',
arch: ['x64'],
},
],
sign: customSign,
signingHashAlgorithms: ['sha256'],
},
};

其中 win.sign 是 Electron Builder 官方提供的自訂簽章入口,詳細說明請參閱 Electron Builder Windows 程式碼簽章文件

customSign

負責呼叫 sslTrus SignTool CLI。

自訂簽章函式

範例:

import { execFileSync } from 'node:child_process';

async function customSign(configuration) {
const {
SIGNTOOL_ACCESS_KEY,
SIGNTOOL_ACCESS_SECRET,
SIGNTOOL_CERT_CODE,
} = process.env;

if (
!SIGNTOOL_ACCESS_KEY ||
!SIGNTOOL_ACCESS_SECRET ||
!SIGNTOOL_CERT_CODE
) {
throw new Error('Missing sslTrus signing credentials');
}

execFileSync(
'./signtool',
[
'sign',
'--access-key',
SIGNTOOL_ACCESS_KEY,
'--access-secret',
SIGNTOOL_ACCESS_SECRET,
'--cert-code',
SIGNTOOL_CERT_CODE,
'--file',
configuration.path,
'--override=true',
'--sha1=false',
'--sha2=true',
'--timestamp-rfc3161=http://timestamp.acs.microsoft.com',
],
{
stdio: 'inherit',
},
);
}

建議使用參數陣列呼叫子處理程序,而不是拼接完整 Shell 指令,以減少路徑跳脫和特殊字元處理問題。

Electron Builder 會依照 signingHashAlgorithms 中的每個雜湊演算法分別呼叫一次簽章函式。上面的範例只啟用 SHA-256,因此每個檔案呼叫一次。

執行建置

設定完成後,正常執行 Electron Builder:

npx electron-builder build \
--config electron-builder.mjs \
--win \
--x64

Electron Builder 在需要對檔案執行簽署時,會自動呼叫 customSign

一次 Electron 建置可能簽署多個檔案,例如:

MyApp.exe
helper.dll
update.exe
uninstall.exe
MyApp Setup.exe

因此,不應簡單理解為「一次 Electron 打包只產生一次簽章」。

實際簽章次數取決於建置過程中有多少檔案執行了遠端簽章。

Advanced Installer

Advanced Installer 是基於 Windows Installer 技術的安裝包製作工具。

可以透過 Advanced Installer 的自訂簽章工具功能呼叫 sslTrus SignTool CLI,使 MSI、EXE、CAB 等建置產物在打包過程中自動完成遠端程式碼簽章。

前提條件

需要準備:

  • sslTrus SignTool CLI,可從 sslTrus 用戶端發佈頁 下載。
  • Access Key。
  • Access Secret。
  • 憑證編號。
  • 已設定完成的 Advanced Installer 專案。

設定自訂簽章工具

開啟 Advanced Installer 專案的:

Digital Signature

配置頁面。

啟用程式碼簽署後,將簽署工具選擇為:

Custom

簽名工具路徑設定為 sslTrus SignTool CLI 可執行檔。

例如:

C:\Tools\sslTrus\signtool.exe

自訂參數需要呼叫:

sign

子命令,並向用戶端傳入:

  • Access Key
  • Access Secret
  • Cert Code
  • SHA-2 簽章設定
  • 時間戳伺服器
  • 檔案路徑

建議優先透過安全方式提供 Access Key 和 Access Secret,避免將長期有效的 Access Secret 明文儲存到可公開取得的專案檔案中。

SignTool 參數範例

對應的簽章邏輯類似:

signtool.exe sign ^
--access-key="YOUR_ACCESS_KEY" ^
--access-secret="YOUR_ACCESS_SECRET" ^
--cert-code="YOUR_CERT_CODE" ^
--nest=true ^
--sha1=false ^
--sha2=true ^
--timestamp-rfc3161=http://timestamp.acs.microsoft.com ^
--desc="Example Application" ^
--override=true ^
--file "app.exe"

在 Advanced Installer 中,實際檔案路徑應由其自訂簽章工具機制傳入,不要固定為範例中的 app.exe

建置設定

如果使用 Advanced Installer 自動簽署安裝套件內部檔案,需要同時檢查建置與壓縮方式。

根據專案實際設定,某些 CAB 封存方式可能會影響自訂簽章流程,應確認最終需要簽署的檔案能夠在對應階段被呼叫。

設定完成後,可以在 Advanced Installer 的數位簽章頁面檢查:

Files configured for signing

從而確認哪些檔案將在建置過程中執行簽署。

簽署次數

Advanced Installer 可能在一次安裝包建置過程中對多個檔案分別執行簽署。

例如:

檔案簽署
app.exe1 次
helper.dll1 次
uninstall.exe1 次
installer.msi1 次
合計4 次

因此:

一次构建 ≠ 一次签名

應根據實際完成遠端簽署的檔案或簽署動作數量計算。

簽署次數

CI/CD 與建置工具通常會自動處理多個產物,因此簽署次數需要特別留意。

基本原則:

签名次数 = 实际成功完成的签名动作数量

例如:

app.exe        → 1 次
library.dll → 1 次
installer.msi → 1 次

如果三個檔案都成功簽署:

合计 = 3 次

Electron Builder 和 Advanced Installer 等建置工具還可能自動產生並簽署:

  • 主程式。
  • DLL。
  • 更新程式。
  • 解除安裝程式。
  • MSI。
  • EXE 安裝套件。
  • 其他輔助可執行檔。

因此,應根據建置記錄和實際簽署產物確認簽署次數,而不是按照 Pipeline 或 Build 的執行次數估算。

更多規則請參閱 參考資料

時間戳記

正式發佈的軟體通常建議新增可信時間戳記。

GitHub Actions、Electron Builder 和 Advanced Installer 整合均可以使用 RFC 3161 時間戳記,例如:

http://timestamp.acs.microsoft.com

時間戳不屬於新的程式碼簽署操作,不單獨增加程式碼簽署次數。

不同 TSA 的通訊協定支援與使用限制請參閱 參考資料

憑證安全

自動化環境中應特別保護:

Access Key
Access Secret
Cert Code

其中 Access Secret 應作為 Secret 管理,不應:

  • 提交到 Git 倉庫。
  • 明文寫入公開 Workflow。
  • 輸出到建置日誌。
  • 寫入公開 Docker 映像。
  • 透過不安全的方式傳遞給第三方建置系統。

GitHub Actions 建議使用:

GitHub Actions Secrets

其他 CI/CD 系統則應使用其對應的 Secret、Credential 或 Variable 管理機制。

如何選擇

場景推薦方式
GitHub Actions WorkflowGitHub Actions
Electron 應用構建Electron Builder
MSI / EXE 安裝包製作Advanced Installer
一般 Shell / PowerShell 自動化SignTool CLI
Windows 軟體原生支援 KSPWindows Provider
自行開發簽署流程API 整合

如果構建系統能夠直接呼叫命令列程式,可以使用 SignTool CLI;如果工具已經提供標準的 Windows KSP/CSP 介面,則優先使用對應的 Windows Provider 整合方式。