Référence de la commande signtool sign
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’identifiant | Paramètre | Variable d’environnement | Description |
|---|---|---|---|
| Access Key | --access-key / -k | ACCESS_KEY | La variable d’environnement est lue automatiquement lorsque le paramètre est vide |
| Access Secret | --access-secret / -s | ACCESS_SECRET | La 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ètre | Adresse réelle du service |
|---|---|
nicsrs | https://ssl.face.nicsrs.com |
Valeur vide, racent ou toute autre valeur | https://ssl.face.racent.com |
ACCESS_KEYetACCESS_SECRETsont les noms de variables d’environnement réellement lus,SIGNTOOL_ACCESS_KEY/SIGNTOOL_ACCESS_SECRETne 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ètre | Forme abrégée | Valeur par défaut | Description |
|---|---|---|---|
--address | -a | Vide | Identifiant de l’adresse du service distant, et non paramètre transmis directement via URL. |
--access-key | -k | Vide | S’il est vide, lire ACCESS_KEY. |
--access-secret | -s | Vide | S’il est vide, lire 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 | Écrase 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 le désactive. |
--timestamp-rfc3161 | — | auto | Adresse du serveur d’horodatage SHA2 RFC3161. auto utilise l’adresse par défaut, une chaîne vide le désactive. |
--desc | -n | vide | Texte de description du programme inscrit dans la signature. |
--url | -u | vide | URL d’information du programme de signature écrite. |
--nest | — | true | Conserve la signature existante et ajoute une signature imbriquée ; false supprime la signature existante. |
--verify | — | false | Renvoie une erreur si le certificat n’est pas approuvé 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 参数=值, 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-keyouACCESS_KEYdoit exister.--access-secretouACCESS_SECRETdoit exister.--cert-codedoit exister.--filedoit exister et ne peut pas être un répertoire.--sha1et--sha2doivent être activés au moins un des deux.
Règles de fichier 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 | Écraser 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, 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
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è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; 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
--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’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’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. |