Saltar al contenido principal

Referencia del comando signtool sign

Nota

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 credencialParámetroVariable de entornoDescripción
Access Key--access-key / -kACCESS_KEYLee automáticamente la variable de entorno cuando el parámetro está vacío
Access Secret--access-secret / -sACCESS_SECRETLee 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ámetroDirección de servicio real
nicsrshttps://ssl.face.nicsrs.com
Valor vacío, racent u otros valores arbitrarioshttps://ssl.face.racent.com
Nota
  • ACCESS_KEY y ACCESS_SECRET son los nombres reales de las variables de entorno que se leen; SIGNTOOL_ACCESS_KEY / SIGNTOOL_ACCESS_SECRET no 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ámetroAbreviaturaValor predeterminadoDescripción
--address-aVacíoIdentificador de la dirección del servicio remoto, no es un parámetro de paso directo de URL.
--access-key-kvacíoSi está vacío, se lee ACCESS_KEY.
--access-secret-svacíoSi está vacío, se lee ACCESS_SECRET.
--cert-code-cvacíoObligatorio. Número de certificado.
--file-fvacíoObligatorio. Ruta del archivo a firmar, no puede ser un directorio.
--out-ovacíoRuta del archivo de salida; si está vacío y la sobrescritura no está habilitada, se genera automáticamente un nombre de archivo predeterminado.
--overridefalseSobrescribir el archivo original con el archivo de salida.
--sha1-1falseActivar la firma SHA1.
--sha2-2trueActivar la firma SHA2.
--timestampautoDirección de sello de tiempo SHA1 Authenticode. auto usa la dirección predeterminada; una cadena vacía lo deshabilita.
--timestamp-rfc3161autoDirección de sello de tiempo SHA2 RFC3161. auto usa la dirección predeterminada; una cadena vacía lo deshabilita.
--desc-nVacíoTexto de descripción del programa escrito en la firma.
--url-uvacíoURL de la información del programa que escribe la firma.
--nesttrueConserva la firma existente y añade una firma anidada; cuando false, elimina la firma existente.
--verifyfalseDevuelve un error si el certificado no es de confianza al añadir la firma.
--dry-runfalseUtiliza el certificado de prueba local para generar la firma, sin invocar la interfaz remota de firma.
Formato de parámetros booleanos

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-key o ACCESS_KEY debe existir.
  • --access-secret o ACCESS_SECRET deben existir.
  • --cert-code debe existir.
  • --file debe existir y no puede ser un directorio.
  • --sha1 y --sha2: al menos uno debe estar habilitado.

Reglas de archivos de salida

Cuando no se especifica --out:

--overrideComportamiento de salida
false (predeterminado)Se genera en el mismo directorio del archivo de entrada, con el nombre de archivo ${name}.signed.${yyyyMMdd.HHmmss}${ext}
trueSobrescribe directamente el archivo de entrada

Ejemplo:

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

--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
Nota

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ámetroValor real de autoUso
--timestamphttp://timestamp.sectigo.comSello de tiempo SHA1 Authenticode
--timestamp-rfc3161http://timestamp.sectigo.comSello 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=
Nota
  • 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
Nota

--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 errorCausa posibleSugerencia 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.