Référence de la commande signtool sign
Dans ce document, signtool fait référence au CLI client de signature de code à distance de sslTrus, et non au signtool.exe fourni avec le SDK Microsoft Windows. Lorsque l’outil du SDK Windows est utilisé, il est explicitement indiqué comme Microsoft signtool.exe.
signtool sign exécute directement la 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’identifiant | Paramètre | Variable d’environnement | Description |
|---|---|---|---|
| Access Key | --access-key / -k | ACCESS_KEY | Lit automatiquement la variable d’environnement lorsque le paramètre est vide |
| Access Secret | --access-secret / -s | ACCESS_SECRET | Lit automatiquement la variable d’environnement 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 et prend en charge les valeurs suivantes :
| Valeur du paramètre | Adresse du service réelle |
|---|---|
nicsrs | https://ssl.face.nicsrs.com |
Valeur vide, racent ou toute autre valeur | https://ssl.face.racent.com |
ACCESS_KEYetACCESS_SECRETsont les noms réels des variables d’environnement lues,SIGNTOOL_ACCESS_KEY/SIGNTOOL_ACCESS_SECRETne seront pas lues automatiquement par la CLI actuelle.- Il est déconseillé d’inscrire l’Access Secret dans l’historique du shell ou dans un dépôt de scripts ; privilégiez l’injection de variables d’environnement au moment de l’exécution ou des variables CI sécurisées.
Description des paramètres
| Paramètre | Forme courte | Valeur par défaut | Description |
|---|---|---|---|
--address | -a | vide | Identifiant d’adresse du service distant, et non paramètre de transmission directe d’URL. |
--access-key | -k | Vide | Lorsqu'il est vide, lit ACCESS_KEY. |
--access-secret | -s | Vide | Lorsqu'il est vide, lit ACCESS_SECRET. |
--cert-code | -c | Vide | Obligatoire. Numéro du certificat. |
--file | -f | vide | Obligatoire. Chemin du fichier à signer, ne peut pas être un répertoire. |
--out | -o | vide | Chemin 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 | Écraser le fichier d'origine avec le fichier de sortie. |
--sha1 | -1 | false | Activer la signature SHA1. |
--sha2 | -2 | true | Activer la signature SHA2. |
--timestamp | — | auto | Adresse du serveur d’horodatage SHA1 Authenticode. auto utilise l’adresse par défaut, une chaîne vide désactive. |
--timestamp-rfc3161 | — | auto | Adresse du serveur d’horodatage SHA2 RFC3161. auto utilise l’adresse par défaut, une chaîne vide désactive. |
--desc | -n | vide | Texte de description du programme inscrit dans la signature. |
--url | -u | vide | URL des informations du programme de signature à écrire. |
--nest | — | true | Conserver la signature existante et ajouter une signature imbriquée ; si false, supprimer la signature existante. |
--verify | — | false | Renvoyer une erreur si le certificat n'est pas fiable lors de l'ajout d'une signature. |
--dry-run | — | false | Utiliser un certificat de test local pour générer la signature, sans appeler l’interface de signature à distance. |
Les paramètres booléens doivent utiliser le format 参数=值, la séparation par espace n’est pas prise en charge :
- Correct :
--sha1=true --sha2=false - Incorrect :
--sha1 true --sha2 false
Règles requises
Les conditions suivantes sont vérifiées avant l’exécution ; si l’une d’elles n’est pas satisfaite, une erreur est signalée et le programme se termine :
--access-keyouACCESS_KEYdoit exister.--access-secretouACCESS_SECRETdoit exister.--cert-codedoit exister.--filedoit exister et ne peut pas être un répertoire.--sha1et--sha2: au moins un doit être activé.
Règles pour les fichiers de sortie
Lorsque --out n'est pas spécifié :
--override | Comportement 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 | Écrase directement le fichier d’entrée |
Exemple :
app.exe → app.signed.20260611.153000.exe
driver.sys → driver.signed.20260611.153000.sys
--override=true écrasera le fichier d’origine, assurez-vous d’avoir effectué une sauvegarde avant l’exécution. En cas d’échec de la signature, la CLI tentera de supprimer le fichier de sortie incomplet.
Choix de l’algorithme
Par défaut, seul SHA2 est activé :
signtool sign -c CERT_CODE -f app.exe
Signature SHA1 uniquement :
signtool sign -c CERT_CODE -f app.exe --sha1=true --sha2=false
Signer à la fois en SHA1 et en SHA2 :
signtool sign -c CERT_CODE -f app.exe --sha1=true --sha2=true
Lorsque SHA1 et SHA2 sont activés simultanément, le flux traite d’abord SHA1, puis SHA2. SHA1 est encore pris en charge actuellement, mais SHA2 est prioritaire pour les nouveaux scénarios de signature.
Configuration de l’horodatage
Les valeurs --timestamp et --timestamp-rfc3161 de auto sont remplacées par l’adresse par défaut lors de la phase de validation :
| Paramètre | Valeur réelle de auto | Usage |
|---|---|---|
--timestamp | http://timestamp.sectigo.com | Horodatage SHA1 Authenticode |
--timestamp-rfc3161 | http://timestamp.sectigo.com | Horodatage 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=
- Seules les adresses d’horodatage commençant par
httpseront utilisées. - SHA1 utilise en priorité
--timestamp; si ce n’est pas une adresse HTTP, il essaie alors d’utiliser--timestamp-rfc3161. - SHA2 utilise
--timestamp-rfc3161. - Si l’ajout de l’horodatage SHA2 échoue, 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 la signature sans horodatage.
Exemples courants
Utiliser des variables d’environnement pour fournir les informations d’identification, 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 informations d’identification directement à l’aide de 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
Utiliser l'adresse NICSRS :
signtool sign \
--address nicsrs \
--cert-code CERT_CODE \
--file app-unsigned.exe \
--out app-signed.exe
Saisissez 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 les signatures existantes) :
signtool sign -c CERT_CODE -f app.exe --nest=true
Écraser le fichier d’origine :
signtool sign -c CERT_CODE -f app.exe --override=true
Dry-run local (test de signature sans appel d'interface distante) :
signtool sign \
-k dummy \
-s dummy \
-c CERT_CODE \
-f app.exe \
--dry-run=true
--dry-run n’appelle pas d’interface de signature à distance, mais continue de lire et d’écrire des fichiers locaux ainsi que d’appeler le certificat auto-signé local. Les vérifications non vides des justificatifs et du numéro de certificat restent appliquées ; c’est pourquoi des justificatifs fictifs sont utilisés dans l’exemple.
Référence de dépannage
| Message d’erreur | Cause possible | Suggestion 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’est pas configuré. | Configurez 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 simultanément. | Activez au moins un algorithme. |
file <path> is a directory | --file pointe vers un répertoire et non un fichier. | Remplacez par le chemin du 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. |