Aller au contenu principal

CI/CD et outils de build

Le service de signature de code à distance sslTrus peut être intégré aux flux CI/CD, à la construction d’applications et à la création de packages d’installation, afin de signer automatiquement le code des artefacts publiés une fois la compilation ou l’empaquetage terminé.

Les scénarios d’intégration typiques actuellement pris en charge sont les suivants :

  • GitHub Actions
  • Electron Builder
  • Advanced Installer

Selon les capacités de l’outil de build, vous pouvez utiliser directement la GitHub Action sslTrus, appeler la CLI SignTool ou passer par l’interface de signature personnalisée fournie par l’outil de build pour réaliser l’intégration.

GitHub Actions

sslTrus fournit une GitHub Action officielle :

ssltrus-official/code-sign-action

Vous pouvez directement effectuer la signature de code à distance des artefacts de build dans un workflow GitHub Actions.

L’Action appelle le service de signature de code à distance de sslTrus pour effectuer la signature et met directement à jour les fichiers spécifiés. Elle est compatible avec les runners Linux, macOS et Windows.

Préparer les secrets GitHub

Il est recommandé d’enregistrer les identifiants de signature de code à distance dans les GitHub Actions Secrets :

SSLTRUS_ACCESS_KEY
SSLTRUS_ACCESS_SECRET
SSLTRUS_CERT_CODE

Ne pas écrire directement l’Access Secret dans le fichier Workflow.

Configuration de base

- 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

Après une signature réussie, build/app.exe sera directement remplacé par le fichier signé.

Signer plusieurs fichiers

files prend en charge la configuration de plusieurs fichiers sur plusieurs lignes :

- 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

Vous pouvez également utiliser des virgules pour séparer les chemins de fichiers.

Les chemins de fichiers en double ne seront traités qu'une seule fois.

Configuration complète

- 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

Paramètres principaux :

ParamètreRequisValeur par défautDescription
access-keyOui-Clé d'accès sslTrus
access-secretOui-Secret d'accès sslTrus
cert-codeOui-Numéro du certificat de signature de code
filesOui-Chemin du fichier à signer
nicsrsNonfalseUtiliser ou non le service NICSRS
dry-runNonfalseUtiliser un certificat de test local pour effectuer une signature de test
timestamp-rfc3161NonautoServeur d’horodatage RFC 3161
descriptionNon-Description du programme à écrire dans la signature Authenticode
description-urlNon-URL du programme à écrire dans la signature Authenticode

Exemple de Workflow complet

Voici un exemple de compilation, de signature et de téléversement des artefacts de build dans un 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

Il est recommandé de placer l’étape de signature dans :

Compilation → Empaquetage → Signature du code → Publication

Avant l’étape de publication dans le flux.

Runner multiplateforme

L’action GitHub peut être appelée dans différents runners :

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

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

Par conséquent, même si la tâche de build s'exécute sous Linux ou macOS, la même Action peut être utilisée pour effectuer la signature à distance des fichiers pris en charge.

Dry Run

Si vous avez besoin de valider le Workflow et la logique de traitement des fichiers, vous pouvez activer :

dry-run: true

Ce mode utilise un certificat de test local et n’appelle pas le service de signature de code à distance.

Par exemple :

- 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 modifiera toujours le fichier cible, il ne faut donc pas le considérer comme un mode d'aperçu ne modifiant aucun fichier.

Electron Builder

Electron Builder peut appeler sslTrus SignTool CLI via une fonction de signature personnalisée, afin de signer automatiquement les fichiers exécutables Windows et les packages d'installation lors du processus de build de l'application Electron.

Flux typique :

Electron Builder

customSign

SignTool CLI

sslTrus 远程代码签名服务

云端 HSM

Prérequis

Avant de commencer, vous devez :

  • Disposer d’un service de signature de code à distance sslTrus utilisable.
  • Avoir obtenu l’Access Key et l’Access Secret.
  • Avoir obtenu le numéro du certificat de signature de code.
  • Le projet Electron doit être construit avec electron-builder.
  • L’environnement de construction doit pouvoir exécuter l’interface CLI sslTrus SignTool, téléchargeable depuis la page de publication du client sslTrus.

Configurer les identifiants

Vous pouvez transmettre les identifiants au script de construction via des variables d’environnement :

Linux et 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"

Ces variables sont lues par le script de signature personnalisé d'Electron, puis transmises à l'interface en ligne de commande SignTool.

Configurer Electron Builder

Dans :

electron-builder.mjs

Ou dans le fichier de configuration Electron Builder réellement utilisé par le projet, définissez une fonction de signature personnalisée pour Windows :

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

Parmi eux, win.sign est le point d’entrée de signature personnalisée officiellement fourni par Electron Builder. Pour plus de détails, consultez la documentation de signature de code Windows d’Electron Builder.

customSign

Responsable d’appeler la CLI sslTrus SignTool.

Fonction de signature personnalisée

Exemple :

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',
},
);
}

Il est recommandé d’appeler le sous-processus avec un tableau de paramètres plutôt que de construire la ligne de commande Shell complète, afin de réduire les problèmes d’échappement des chemins et de gestion des caractères spéciaux.

Electron Builder appellera la fonction de signature une fois pour chaque algorithme de hachage dans signingHashAlgorithms. L’exemple ci-dessus n’active que SHA-256, donc chaque fichier est appelé une fois.

Exécution de la compilation

Une fois la configuration terminée, exécutez normalement Electron Builder :

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

Lorsqu'Electron Builder doit signer des fichiers, il appelle automatiquement customSign.

Une même build Electron peut signer plusieurs fichiers, par exemple :

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

Par conséquent, il ne faut pas simplement comprendre qu’« un seul empaquetage Electron ne produit qu’une seule signature ».

Le nombre réel de signatures dépend du nombre de fichiers ayant fait l’objet d’une signature à distance au cours du processus de construction.

Advanced Installer

Advanced Installer est un outil de création de packages d’installation basé sur la technologie Windows Installer.

Vous pouvez utiliser la fonction d’outil de signature personnalisé d’Advanced Installer pour appeler le sslTrus SignTool CLI, afin que les artefacts de construction comme MSI, EXE, CAB réalisent automatiquement la signature de code à distance pendant le processus d’empaquetage.

Prérequis

Vous devez préparer :

Configurer l’outil de signature personnalisé

Ouvrez le projet Advanced Installer :

Digital Signature

Page de configuration.

Après avoir activé la signature de code, sélectionnez l’outil de signature comme suit :

Custom

Définissez le chemin de l'outil de signature sur le fichier exécutable CLI de sslTrus SignTool.

Par exemple :

C:\Tools\sslTrus\signtool.exe

Paramètres personnalisés à appeler :

sign

Sous-commandes, et transmet au client :

  • Access Key
  • Access Secret
  • Cert Code
  • Paramètres de signature SHA-2
  • Serveur d’horodatage
  • Chemin du fichier

Il est recommandé de fournir l’Access Key et l’Access Secret en priorité par des moyens sécurisés, afin d’éviter d’enregistrer en clair un Access Secret à validité prolongée dans des fichiers de projet accessibles publiquement.

Exemple de paramètres SignTool

La logique de signature correspondante est similaire à :

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"

Dans Advanced Installer, le chemin d’accès réel du fichier doit être transmis par son mécanisme d’outil de signature personnalisé, et non fixé sur l’exemple app.exe.

Configuration de la compilation

Si vous utilisez Advanced Installer pour signer automatiquement les fichiers internes du package d’installation, vous devez également vérifier les méthodes de compilation et de compression.

Selon la configuration réelle du projet, certaines méthodes d’archivage CAB peuvent affecter le flux de signature personnalisée. Il convient donc de confirmer que les fichiers devant être signés peuvent être appelés à l’étape correspondante.

Une fois la configuration terminée, vous pouvez vérifier dans la page de signature numérique d’Advanced Installer :

Files configured for signing

afin de confirmer quels fichiers seront signés au cours du processus de génération.

Nombre de signatures

Advanced Installer peut signer plusieurs fichiers séparément au cours d’une même génération de package d’installation.

Par exemple :

FichierSignature
app.exe1 fois
helper.dll1 fois
uninstall.exe1 fois
installer.msi1 fois
Total4 fois

Par conséquent :

一次构建 ≠ 一次签名

Il doit être calculé en fonction du nombre réel de fichiers ou d’actions de signature à distance effectués.

Nombre de signatures

Les outils CI/CD et de build traitent généralement automatiquement plusieurs artefacts, le nombre de signatures doit donc faire l’objet d’une attention particulière.

Principes de base :

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

Par exemple :

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

Si les trois fichiers sont tous signés avec succès :

合计 = 3 次

Les outils de build tels qu'Electron Builder et Advanced Installer peuvent également générer et signer automatiquement :

  • Le programme principal.
  • Les DLL.
  • Le programme de mise à jour.
  • Le programme de désinstallation.
  • Le MSI.
  • Le package d'installation EXE.
  • D'autres fichiers exécutables auxiliaires.

Par conséquent, le nombre de signatures doit être confirmé en fonction des journaux de build et des artefacts réellement signés, et non estimé selon le nombre d'exécutions du Pipeline ou du Build.

Pour plus de règles, veuillez consulter les documents de référence.

Horodatage

Il est généralement recommandé d'ajouter un horodatage de confiance aux logiciels publiés officiellement.

Les intégrations GitHub Actions, Electron Builder et Advanced Installer peuvent toutes utiliser l'horodatage RFC 3161, par exemple :

http://timestamp.acs.microsoft.com

L’horodatage ne constitue pas une nouvelle opération de signature de code et n’augmente pas séparément le nombre de signatures de code.

Pour connaître la prise en charge des protocoles et les restrictions d’utilisation des différentes TSA, veuillez consulter les documents de référence.

Sécurité des justificatifs

Dans un environnement automatisé, il convient de protéger tout particulièrement :

Access Key
Access Secret
Cert Code

Parmi eux, l’Access Secret doit être géré comme un Secret et ne doit pas :

  • Être commité dans un dépôt Git.
  • Être écrit en clair dans un Workflow public.
  • Être affiché dans les journaux de construction.
  • Être écrit dans une image Docker publique.
  • Être transmis de manière non sécurisée à un système de construction tiers.

GitHub Actions recommande d’utiliser :

GitHub Actions Secrets

Les autres systèmes CI/CD doivent utiliser leurs mécanismes correspondants de gestion des secrets, des identifiants ou des variables.

Comment choisir

ScénarioMéthode recommandée
Workflow GitHub ActionsGitHub Actions
Build d’application ElectronElectron Builder
Création de packages d’installation MSI / EXEAdvanced Installer
Automatisation Shell / PowerShell ordinaireSignTool CLI
Logiciels Windows prenant en charge nativement KSPWindows Provider
Développement autonome d’un flux de signatureIntégration API

Si le système de build peut appeler directement des programmes en ligne de commande, vous pouvez utiliser SignTool CLI ; si l’outil fournit déjà une interface standard Windows KSP/CSP, privilégiez l’intégration via le Windows Provider correspondant.