Перейти к основному содержимому

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

Исходный код и информация о версиях приведены в ssltrus-official/code-sign-action. В текущей стабильной конфигурации используется тег основной версии @v1.

Можно непосредственно в рабочем процессе GitHub Actions выполнить удалённое подписание собранных артефактов.

Action вызывает службу удалённого подписания кода sslTrus, выполняет подписание и напрямую обновляет указанные файлы; поддерживаются runner на Linux, macOS и Windows.

Подготовка секретов GitHub​

Рекомендуется сохранить учётные данные для удалённого подписания кода в 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-secretДа-Секрет доступа sslTrus
cert-codeДа-Номер сертификата для подписи кода
filesДа-Путь к файлу, который требуется подписать
nicsrsНетfalseИспользовать ли службу NICSRS
dry-runНетfalseВыполнить тестовую подпись с помощью локального тестового сертификата
timestamp-rfc3161НетautoСервер отметок времени RFC 3161; передайте пустое значение, чтобы отключить отметку времени
descriptionНет-Записать описание программы в подпись Authenticode
description-urlНет-Записать URL программы в подпись Authenticode

Полный пример Workflow​

Ниже приведён пример компиляции, подписания и загрузки артефактов сборки в Runner на Windows:

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 через пользовательскую функцию подписи, чтобы автоматически подписывать исполняемые файлы Windows и установочные пакеты в процессе сборки Electron-приложения.

Типичный процесс:

Electron Builder
↓
customSign
↓
SignTool CLI
↓
sslTrus 远程代码签名服务
↓
云端 HSM

Предварительные условия​

Перед началом необходимо:

  • Уже иметь доступную услугу удалённого подписания кода sslTrus.
  • Получить Access Key и Access Secret.
  • Получить номер сертификата подписания кода.
  • Проект Electron собирается с помощью electron-builder.
  • Сборочное окружение может выполнять CLI sslTrus SignTool, который можно загрузить со страницы выпусков клиента 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, автоматически выполняли удалённую подпись кода в процессе упаковки.

Предварительные условия​

Необходимо подготовить:

Настройка пользовательского инструмента подписи​

Откройте в проекте 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 должен управляться как секрет и не должен:

  • Передаваться в Git-репозиторий.
  • Записываться в открытом виде в публичный Workflow.
  • Выводиться в журналы сборки.
  • Записываться в публичный Docker-образ.
  • Передаваться сторонним системам сборки небезопасным способом.

GitHub Actions рекомендует использовать:

GitHub Actions Secrets

Другие CI/CD-системы должны использовать соответствующие им механизмы управления Secret, Credential или Variable.

Как выбрать​

СценарийРекомендуемый способ
GitHub Actions WorkflowGitHub Actions
Сборка приложения ElectronElectron Builder
Создание установочных пакетов MSI / EXEAdvanced Installer
Обычная автоматизация Shell / PowerShellSignTool CLI
Программное обеспечение Windows с нативной поддержкой KSPWindows Provider
Самостоятельная разработка процесса подписиИнтеграция через API

Если система сборки может напрямую вызывать программы командной строки, можно использовать SignTool CLI; если инструмент уже предоставляет стандартный интерфейс Windows KSP/CSP, предпочтительно использовать соответствующий способ интеграции через Windows Provider.