Aller au contenu principal

Référence de la commande signtool sign

Remarque

Dans ce document, signtool désigne le client CLI de signature de code à distance de sslTrus, et non le signtool.exe fourni avec le SDK Microsoft Windows. Lorsque l'outil du SDK Windows est utilisé, il sera explicitement indiqué comme Microsoft signtool.exe.

signtool sign exécute directement une signature à distance sur un fichier local. Le CLI extrait localement les données à signer, appelle le service distant pour effectuer la signature avec la clé privée, puis réécrit la signature, l'horodatage et les informations du certificat dans le fichier de sortie.

signtool sign [flags]

Consulter l’aide et la version :

signtool --help
signtool --version

Configuration des identifiants​

La commande sign lit les identifiants d’accès comme suit :

Élément d’identifiantParamètreVariable d’environnementDescription
Access Key--access-key / -kACCESS_KEYLa variable d’environnement est lue automatiquement lorsque le paramètre est vide
Access Secret--access-secret / -sACCESS_SECRETLa variable d’environnement est lue automatiquement lorsque le paramètre est vide
export ACCESS_KEY="your-access-key"
export ACCESS_SECRET="your-access-secret"

L'adresse du service distant est contrôlée par le paramètre --address, qui prend en charge les valeurs suivantes :

Valeur du paramètreAdresse réelle du service
nicsrshttps://ssl.face.nicsrs.com
Valeur vide, racent ou toute autre valeurhttps://ssl.face.racent.com
Remarque
  • ACCESS_KEY et ACCESS_SECRET sont les noms de variables d’environnement réellement lus, SIGNTOOL_ACCESS_KEY / SIGNTOOL_ACCESS_SECRET ne seront pas lus automatiquement par le CLI actuel.
  • Il est déconseillé d’écrire l’Access Secret dans l’historique du shell ou dans le dépôt de scripts ; privilégiez les variables d’environnement injectées au moment de l’exécution ou les variables CI sécurisées.

Description des paramètres​

ParamètreForme abrégéeValeur par défautDescription
--address-aVideIdentifiant de l’adresse du service distant, et non paramètre transmis directement via URL.
--access-key-kVideS’il est vide, lire ACCESS_KEY.
--access-secret-sVideS’il est vide, lire ACCESS_SECRET.
--cert-code-cVideObligatoire. Numéro du certificat.
--file-fvideObligatoire. Chemin du fichier à signer, ne peut pas être un répertoire.
--out-ovideChemin du fichier de sortie ; s’il est vide et que l’écrasement n’est pas activé, un nom de fichier par défaut est généré automatiquement.
--override—falseÉcrase le fichier d’origine avec le fichier de sortie.
--sha1-1falseActiver la signature SHA1.
--sha2-2trueActiver la signature SHA2.
--timestamp—autoAdresse du serveur d’horodatage SHA1 Authenticode. auto utilise l’adresse par défaut, une chaîne vide le désactive.
--timestamp-rfc3161—autoAdresse du serveur d’horodatage SHA2 RFC3161. auto utilise l’adresse par défaut, une chaîne vide le désactive.
--desc-nvideTexte de description du programme inscrit dans la signature.
--url-uvideURL d’information du programme de signature écrite.
--nest—trueConserve la signature existante et ajoute une signature imbriquée ; false supprime la signature existante.
--verify—falseRenvoie une erreur si le certificat n’est pas approuvé lors de l’ajout d’une signature.
--dry-run—falseUtiliser un certificat de test local pour générer la signature, sans appeler l’interface de signature à distance.
Format des paramètres booléens

Les paramètres booléens doivent utiliser le format 参数=值, sans séparateur d’espace :

  • Correct : --sha1=true --sha2=false
  • Incorrect : --sha1 true --sha2 false

Règles obligatoires​

Avant l’exécution, les conditions suivantes sont vérifiées ; si l’une d’elles n’est pas satisfaite, une erreur est signalée et le programme se termine :

  • --access-key ou ACCESS_KEY doit exister.
  • --access-secret ou ACCESS_SECRET doit exister.
  • --cert-code doit exister.
  • --file doit exister et ne peut pas être un répertoire.
  • --sha1 et --sha2 doivent être activés au moins un des deux.

Règles de fichier de sortie​

Lorsque --out n'est pas spécifié :

--overrideComportement de sortie
false(par défaut)Sortie dans le même répertoire que le fichier d’entrée, avec le nom de fichier ${name}.signed.${yyyyMMdd.HHmmss}${ext}
trueÉcraser directement le fichier d’entrée

Exemple :

app.exe    → app.signed.20260611.153000.exe
driver.sys → driver.signed.20260611.153000.sys
Remarque

--override=true écrasera le fichier d'origine, veuillez confirmer qu'une sauvegarde a été effectuée avant l'exécution. En cas d'échec de signature, la CLI tentera de supprimer le fichier de sortie incomplet.


Sélection de l'algorithme​

Par défaut, seul SHA2 est activé :

signtool sign -c CERT_CODE -f app.exe

Signer uniquement SHA1 :

signtool sign -c CERT_CODE -f app.exe --sha1=true --sha2=false

signer simultanément en SHA1 et SHA2 :

signtool sign -c CERT_CODE -f app.exe --sha1=true --sha2=true
Remarque

Lorsque SHA1 et SHA2 sont activés simultanément, le flux traite d’abord SHA1, puis SHA2. SHA1 est toujours pris en charge, mais les nouveaux scénarios de signature privilégient SHA2.


Configuration de l’horodatage​

Les valeurs auto de --timestamp et --timestamp-rfc3161 seront remplacées par les adresses par défaut lors de la phase de validation :

ParamètreValeur réelle de autoUsage
--timestamphttp://timestamp.sectigo.comHorodatage SHA1 Authenticode
--timestamp-rfc3161http://timestamp.sectigo.comHorodatage SHA2 RFC3161

Service d’horodatage SHA2 personnalisé :

signtool sign \
-c CERT_CODE \
-f app.exe \
--timestamp-rfc3161=http://timestamp.acs.microsoft.com

Désactiver l’horodatage SHA2 :

signtool sign -c CERT_CODE -f app.exe --timestamp-rfc3161=

Désactiver tous les horodatages :

signtool sign -c CERT_CODE -f app.exe --timestamp= --timestamp-rfc3161=
Remarque
  • Seules les adresses d'horodatage commençant par http seront utilisées.
  • SHA1 utilise en priorité --timestamp ; s'il ne s'agit pas d'une adresse HTTP, il tentera alors d'utiliser --timestamp-rfc3161.
  • SHA2 utilise --timestamp-rfc3161.
  • En cas d'échec de l'ajout de l'horodatage SHA2, une nouvelle tentative est automatiquement effectuée entre les adresses par défaut de Microsoft et de Sectigo.
  • L'échec de l'horodatage n'entraîne pas nécessairement l'échec de la signature ; la CLI enregistre l'erreur et conserve le résultat de signature sans horodatage.

Exemples courants​

Utiliser des variables d'environnement pour fournir les identifiants, signature SHA2 par défaut :

export ACCESS_KEY="your-access-key"
export ACCESS_SECRET="your-access-secret"

signtool sign \
--cert-code CERT_CODE \
--file app-unsigned.exe \
--out app-signed.exe

Fournir les identifiants directement via les paramètres :

signtool sign \
--access-key "your-access-key" \
--access-secret "your-access-secret" \
--cert-code CERT_CODE \
--file app-unsigned.exe \
--out app-signed.exe

Utilisation de l'adresse NICSRS :

signtool sign \
--address nicsrs \
--cert-code CERT_CODE \
--file app-unsigned.exe \
--out app-signed.exe

Écrivez la description du programme et l’URL du site officiel :

signtool sign \
-c CERT_CODE \
-f app-unsigned.exe \
-o app-signed.exe \
--desc "Example Application" \
--url "https://example.com"

Ajouter une signature imbriquée (conserver la signature existante) :

signtool sign -c CERT_CODE -f app.exe --nest=true

Écraser le fichier original :

signtool sign -c CERT_CODE -f app.exe --override=true

Dry-run local de test (sans appel à l’interface distante) :

signtool sign \
-k dummy \
-s dummy \
-c CERT_CODE \
-f app.exe \
--dry-run=true
Remarque

--dry-run n’appelle pas l’interface de signature à distance, mais lit et écrit toujours des fichiers locaux et fait appel à un certificat autosigné local. Il passe actuellement encore par la validation non vide des identifiants et du numéro de certificat, c’est pourquoi l’exemple utilise des identifiants de substitution.


Référence de dépannage​

Message d’erreurCause possibleSuggestion de traitement
access key is required...--access-key n’a pas été transmis et ACCESS_KEY n’a pas non plus été défini.Définissez la variable d’environnement ou utilisez -k.
access secret is required...--access-secret n’a pas été transmis et ACCESS_SECRET n’a pas été défini.Définissez la variable d’environnement ou utilisez -s.
cert code is required...Le numéro de certificat n’a pas été transmis.Utilisez -c CERT_CODE.
sha1 or sha2 is required...SHA1 et SHA2 ont été désactivés en même temps.Activez au moins un algorithme.
file <path> is a directory--file pointe vers un répertoire et non vers un fichier.Modifiez le chemin vers le fichier à signer.
Échec de l’horodatage, mais le fichier signé a été généréLe service d’horodatage est indisponible ou la validation de la chaîne de certificats a échoué.Vérifiez l’URL d’horodatage et remplacez --timestamp-rfc3161 si nécessaire.