Referencia del comando signtool sign
En este documento, signtool se refiere a la CLI del cliente de firma de código remota de sslTrus, no al signtool.exe incluido con el SDK de Microsoft Windows. Cuando se utilicen herramientas del SDK de Windows, se escribirá explícitamente como Microsoft signtool.exe.
signtool sign ejecuta directamente la firma remota en archivos locales. La CLI extrae localmente los datos que se van a firmar, llama al servicio remoto para completar la firma con la clave privada y, a continuación, escribe la firma, la marca de tiempo y la información del certificado en el archivo de salida.
signtool sign [flags]
Ver ayuda y versión:
signtool --help
signtool --version
Configuración de credenciales
El comando sign lee las credenciales de acceso de las siguientes maneras:
| Elemento de credencial | Parámetro | Variable de entorno | Descripción |
|---|---|---|---|
| Access Key | --access-key / -k | ACCESS_KEY | Lee automáticamente la variable de entorno cuando el parámetro está vacío |
| Access Secret | --access-secret / -s | ACCESS_SECRET | Lee automáticamente la variable de entorno cuando el parámetro está vacío |
export ACCESS_KEY="your-access-key"
export ACCESS_SECRET="your-access-secret"
La dirección de servicio remoto está controlada por el parámetro --address, que admite los siguientes valores:
| Valor del parámetro | Dirección de servicio real |
|---|---|
nicsrs | https://ssl.face.nicsrs.com |
Valor vacío, racent u otros valores arbitrarios | https://ssl.face.racent.com |
ACCESS_KEYyACCESS_SECRETson los nombres reales de las variables de entorno que se leen;SIGNTOOL_ACCESS_KEY/SIGNTOOL_ACCESS_SECRETno serán leídos automáticamente por el CLI actual.- No se recomienda escribir el Access Secret en el historial del shell ni en el repositorio de scripts; priorice la inyección de variables de entorno en tiempo de ejecución o variables seguras de CI.
Descripción de parámetros
| Parámetro | Abreviatura | Valor predeterminado | Descripción |
|---|---|---|---|
--address | -a | Vacío | Identificador de la dirección del servicio remoto, no es un parámetro de paso directo de URL. |
--access-key | -k | vacío | Si está vacío, se lee ACCESS_KEY. |
--access-secret | -s | vacío | Si está vacío, se lee ACCESS_SECRET. |
--cert-code | -c | vacío | Obligatorio. Número de certificado. |
--file | -f | vacío | Obligatorio. Ruta del archivo a firmar, no puede ser un directorio. |
--out | -o | vacío | Ruta del archivo de salida; si está vacío y la sobrescritura no está habilitada, se genera automáticamente un nombre de archivo predeterminado. |
--override | — | false | Sobrescribir el archivo original con el archivo de salida. |
--sha1 | -1 | false | Activar la firma SHA1. |
--sha2 | -2 | true | Activar la firma SHA2. |
--timestamp | — | auto | Dirección de sello de tiempo SHA1 Authenticode. auto usa la dirección predeterminada; una cadena vacía lo deshabilita. |
--timestamp-rfc3161 | — | auto | Dirección de sello de tiempo SHA2 RFC3161. auto usa la dirección predeterminada; una cadena vacía lo deshabilita. |
--desc | -n | Vacío | Texto de descripción del programa escrito en la firma. |
--url | -u | vacío | URL de la información del programa que escribe la firma. |
--nest | — | true | Conserva la firma existente y añade una firma anidada; cuando false, elimina la firma existente. |
--verify | — | false | Devuelve un error si el certificado no es de confianza al añadir la firma. |
--dry-run | — | false | Utiliza el certificado de prueba local para generar la firma, sin invocar la interfaz remota de firma. |
Los parámetros booleanos deben usar el formato 参数=值; no se admite la separación por espacios:
- Correcto:
--sha1=true --sha2=false - Incorrecto:
--sha1 true --sha2 false
Reglas obligatorias
Antes de la ejecución se validan las siguientes condiciones; si alguna no se cumple, se informa del error y se aborta:
--access-keyoACCESS_KEYdebe existir.--access-secretoACCESS_SECRETdeben existir.--cert-codedebe existir.--filedebe existir y no puede ser un directorio.--sha1y--sha2: al menos uno debe estar habilitado.
Reglas de archivos de salida
Cuando no se especifica --out:
--override | Comportamiento de salida |
|---|---|
false (predeterminado) | Se genera en el mismo directorio del archivo de entrada, con el nombre de archivo ${name}.signed.${yyyyMMdd.HHmmss}${ext} |
true | Sobrescribe directamente el archivo de entrada |
Ejemplo:
app.exe → app.signed.20260611.153000.exe
driver.sys → driver.signed.20260611.153000.sys
--override=true sobrescribirá el archivo original. Antes de ejecutarlo, asegúrese de haber realizado una copia de seguridad. Si la firma falla, la CLI intentará eliminar los archivos de salida incompletos.
Selección de algoritmo
De forma predeterminada, solo se habilita SHA2:
signtool sign -c CERT_CODE -f app.exe
Solo firmado con SHA1:
signtool sign -c CERT_CODE -f app.exe --sha1=true --sha2=false
Firmar SHA1 y SHA2 al mismo tiempo:
signtool sign -c CERT_CODE -f app.exe --sha1=true --sha2=true
Cuando se habilitan SHA1 y SHA2 simultáneamente, el proceso maneja primero SHA1 y luego SHA2. SHA1 todavía es compatible, pero en los nuevos escenarios de firma se prioriza SHA2.
Configuración de sellado de tiempo
Los valores de auto de --timestamp y --timestamp-rfc3161 se reemplazarán por las direcciones predeterminadas durante la fase de verificación:
| Parámetro | Valor real de auto | Uso |
|---|---|---|
--timestamp | http://timestamp.sectigo.com | Sello de tiempo SHA1 Authenticode |
--timestamp-rfc3161 | http://timestamp.sectigo.com | Sello de tiempo SHA2 RFC3161 |
Servicio personalizado de sellado de tiempo SHA2:
signtool sign \
-c CERT_CODE \
-f app.exe \
--timestamp-rfc3161=http://timestamp.acs.microsoft.com
Desactivar la marca de tiempo SHA2:
signtool sign -c CERT_CODE -f app.exe --timestamp-rfc3161=
Desactivar todas las marcas de tiempo:
signtool sign -c CERT_CODE -f app.exe --timestamp= --timestamp-rfc3161=
- Solo se utilizarán las direcciones de sello de tiempo que comiencen con
http. - SHA1 prioriza el uso de
--timestamp; si no es una dirección HTTP, se intentará usar--timestamp-rfc3161. - SHA2 utiliza
--timestamp-rfc3161. - Si falla la adición del sello de tiempo SHA2, se reintentará automáticamente una vez entre las direcciones predeterminadas de Microsoft y Sectigo.
- Un fallo del sello de tiempo no implica necesariamente un fallo de la firma; la CLI registrará el error y conservará el resultado de la firma sin sello de tiempo.
Ejemplos comunes
Proporcionar credenciales mediante variables de entorno, firma SHA2 predeterminada:
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
Proporcione las credenciales directamente mediante parámetros:
signtool sign \
--access-key "your-access-key" \
--access-secret "your-access-secret" \
--cert-code CERT_CODE \
--file app-unsigned.exe \
--out app-signed.exe
Uso de la dirección NICSRS:
signtool sign \
--address nicsrs \
--cert-code CERT_CODE \
--file app-unsigned.exe \
--out app-signed.exe
Escriba la descripción del programa y la URL del sitio web oficial:
signtool sign \
-c CERT_CODE \
-f app-unsigned.exe \
-o app-signed.exe \
--desc "Example Application" \
--url "https://example.com"
Añadir firma anidada (conservando las firmas existentes):
signtool sign -c CERT_CODE -f app.exe --nest=true
Sobrescribir el archivo original:
signtool sign -c CERT_CODE -f app.exe --override=true
dry-run firma de prueba local (sin llamar a la interfaz remota):
signtool sign \
-k dummy \
-s dummy \
-c CERT_CODE \
-f app.exe \
--dry-run=true
--dry-run no invoca la interfaz de firma remota, pero aun así leerá y escribirá archivos locales e invocará el certificado autofirmado local. Actualmente, aún pasa por la validación no vacía de credenciales y número de certificado, por lo que en el ejemplo se utilizan credenciales de marcador de posición.
Referencia de resolución de problemas
| Mensaje de error | Causa posible | Sugerencia de manejo |
|---|---|---|
access key is required... | No se pasó --access-key ni se configuró ACCESS_KEY. | Configure la variable de entorno o use -k. |
access secret is required... | No se pasó --access-secret y no se configuró ACCESS_SECRET. | Configure la variable de entorno o use -s. |
cert code is required... | No se pasó el número de certificado. | Use -c CERT_CODE. |
sha1 or sha2 is required... | SHA1 y SHA2 están desactivados al mismo tiempo. | Habilite al menos un algoritmo. |
file <path> is a directory | --file apunta a un directorio en lugar de un archivo. | Cambie a la ruta del archivo que se va a firmar. |
| La marca de tiempo falla pero el archivo de firma ya se generó | El servicio de marca de tiempo no está disponible o la verificación de la cadena de certificados falló. | Verifique la URL de marca de tiempo y, si es necesario, reemplace --timestamp-rfc3161. |