Команда signtool sign: справочник
signtool в этой статье означает CLI-клиент удалённого подписывания кода sslTrus, а не signtool.exe, входящий в Microsoft Windows SDK. При использовании инструмента Windows SDK будет явно указано Microsoft signtool.exe.
signtool sign напрямую выполняет удалённое подписывание локального файла. CLI извлекает данные для подписания локально, вызывает удалённый сервис для подписания закрытым ключом, а затем записывает подпись, метку времени и информацию о сертификате обратно в выходной файл.
signtool sign [flags]
Просмотр справки и версии:
signtool --help
signtool --version
Настройка учетных данных
Команда sign считывает учетные данные доступа следующими способами:
| Элемент учетных данных | Параметр | Переменная окружения | Описание |
|---|---|---|---|
| Access Key | --access-key / -k | ACCESS_KEY | Если параметр пуст, автоматически считывается переменная окружения |
| Access Secret | --access-secret / -s | ACCESS_SECRET | Если параметр пуст, автоматически считывается переменная окружения |
export ACCESS_KEY="your-access-key"
export ACCESS_SECRET="your-access-secret"
Адрес удаленного сервиса контролируется параметром --address, поддерживаются следующие значения:
| Значение параметра | Фактический адрес сервиса |
|---|---|
nicsrs | https://ssl.face.nicsrs.com |
Пустое значение, racent или любое другое значение | https://ssl.face.racent.com |
ACCESS_KEYиACCESS_SECRET— это фактические имена считываемых переменных окружения, аSIGNTOOL_ACCESS_KEY/SIGNTOOL_ACCESS_SECRETне считываются текущим CLI автоматически.- Не рекомендуется записывать Access Secret в историю shell или репозиторий скриптов; предпочтительно использовать переменные окружения, внедряемые во время выполнения, или безопасные переменные CI.
Описание параметров
| Параметр | Сокращение | Значение по умолчанию | Описание |
|---|---|---|---|
--address | -a | Пусто | Идентификатор адреса удалённого сервиса, не является параметром прозрачной передачи URL. |
--access-key | -k | пусто | Если пусто, читается из ACCESS_KEY. |
--access-secret | -s | пусто | Если пусто, читается из ACCESS_SECRET. |
--cert-code | -c | пусто | Обязательно. Номер сертификата. |
--file | -f | пусто | Обязательно. Путь к файлу для подписи, не может быть каталогом. |
--out | -o | пусто | Путь к выходному файлу; если пусто и перезапись не включена, автоматически генерируется имя файла по умолчанию. |
--override | — | false | Перезаписать исходный файл выходным файлом. |
--sha1 | -1 | false | Включить подпись SHA1. |
--sha2 | -2 | true | Включить подпись SHA2. |
--timestamp | — | auto | Адрес временной метки SHA1 Authenticode. auto использует адрес по умолчанию, пустая строка отключает. |
--timestamp-rfc3161 | — | auto | Адрес временной метки SHA2 RFC3161. auto использует адрес по умолчанию, пустая строка отключает. |
--desc | -n | пусто | Текст описания программы, записываемый в подпись. |
--url | -u | пусто | URL с информацией о программе, записываемой в подпись. |
--nest | — | true | Сохранить существующую подпись и добавить вложенную подпись; при false существующая подпись очищается. |
--verify | — | false | При добавлении подписи возвращается ошибка, если сертификат не является доверенным. |
--dry-run | — | false | Используйте локальный тестовый сертификат для создания подписи, без вызова удалённого интерфейса подписи. |
Логические параметры должны использовать формат 参数=值, разделение пробелами не поддерживается:
- Правильно:
--sha1=true --sha2=false - Неправильно:
--sha1 true --sha2 false
Обязательные правила
Перед выполнением проверяются следующие условия, при невыполнении любого из них выводится ошибка и выполнение прекращается:
--access-keyилиACCESS_KEYдолжен существовать.--access-secretилиACCESS_SECRETдолжен существовать.--cert-codeдолжен существовать.--fileдолжен существовать и не может быть каталогом.--sha1и--sha2должны быть включены хотя бы один из них.
Правила для выходных файлов
Если --out не указан:
--override | Поведение вывода |
|---|---|
false (по умолчанию) | Вывод в тот же каталог, что и входной файл, с именем файла ${name}.signed.${yyyyMMdd.HHmmss}${ext} |
true | Напрямую перезаписать входной файл |
Пример:
app.exe → app.signed.20260611.153000.exe
driver.sys → driver.signed.20260611.153000.sys
--override=true перезапишет исходный файл, перед выполнением убедитесь, что создана резервная копия. При сбое подписи CLI постарается удалить незавершённый выходной файл.
Выбор алгоритма
По умолчанию включён только SHA2:
signtool sign -c CERT_CODE -f app.exe
Только подпись SHA1:
signtool sign -c CERT_CODE -f app.exe --sha1=true --sha2=false
Одновременная подпись SHA1 и SHA2:
signtool sign -c CERT_CODE -f app.exe --sha1=true --sha2=true
При одновременном включении SHA1 и SHA2 процесс сначала обрабатывает SHA1, затем SHA2. SHA1 в настоящее время по-прежнему поддерживается, но для новых сценариев подписи приоритет следует отдавать SHA2.
Настройка метки времени
Значения --timestamp и --timestamp-rfc3161 параметра auto на этапе проверки будут заменены адресами по умолчанию:
| Параметр | Фактическое значение auto | Назначение |
|---|---|---|
--timestamp | http://timestamp.sectigo.com | Метка времени SHA1 Authenticode |
--timestamp-rfc3161 | http://timestamp.sectigo.com | Метка времени SHA2 RFC3161 |
Пользовательский сервис метки времени SHA2:
signtool sign \
-c CERT_CODE \
-f app.exe \
--timestamp-rfc3161=http://timestamp.acs.microsoft.com
Отключить временную метку SHA2:
signtool sign -c CERT_CODE -f app.exe --timestamp-rfc3161=
Отключить все временные метки:
signtool sign -c CERT_CODE -f app.exe --timestamp= --timestamp-rfc3161=
- Используются только адреса меток времени, начинающиеся с
http. - Для SHA1 в первую очередь используется
--timestamp; если это не HTTP-адрес, предпринимается попытка использовать--timestamp-rfc3161. - SHA2 использует
--timestamp-rfc3161. - Если для SHA2 не удалось добавить метку времени, один раз автоматически выполняется повторная попытка между адресами Microsoft и Sectigo по умолчанию.
- Сбой метки времени не обязательно приводит к сбою подписи: CLI записывает ошибку и сохраняет результат подписи без метки времени.
Часто используемые примеры
Предоставление учётных данных через переменные окружения, подпись SHA2 по умолчанию:
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
Прямое предоставление учетных данных с помощью параметров:
signtool sign \
--access-key "your-access-key" \
--access-secret "your-access-secret" \
--cert-code CERT_CODE \
--file app-unsigned.exe \
--out app-signed.exe
Использование адреса NICSRS:
signtool sign \
--address nicsrs \
--cert-code CERT_CODE \
--file app-unsigned.exe \
--out app-signed.exe
Напишите описание программы и URL официального сайта:
signtool sign \
-c CERT_CODE \
-f app-unsigned.exe \
-o app-signed.exe \
--desc "Example Application" \
--url "https://example.com"
Добавить вложенную подпись (сохранить существующую подпись):
signtool sign -c CERT_CODE -f app.exe --nest=true
Перезаписать исходный файл:
signtool sign -c CERT_CODE -f app.exe --override=true
Пробный локальный запуск dry-run (без вызова удалённого интерфейса):
signtool sign \
-k dummy \
-s dummy \
-c CERT_CODE \
-f app.exe \
--dry-run=true
--dry-run не вызывает интерфейс удалённого подписания, но по-прежнему читает и записывает локальные файлы и вызывает локальный самоподписанный сертификат. В настоящее время всё ещё выполняется проверка на непустые учётные данные и номер сертификата, поэтому в примере использованы учётные данные-заглушки.
Справочник по устранению неполадок
| Сообщение об ошибке | Возможная причина | Рекомендация по устранению |
|---|---|---|
access key is required... | Не передан --access-key, и не задан ACCESS_KEY. | Задайте переменную окружения или используйте -k. |
access secret is required... | Не передан --access-secret и не задан ACCESS_SECRET. | Задайте переменную окружения или используйте -s. |
cert code is required... | Не передан номер сертификата. | Используйте -c CERT_CODE. |
sha1 or sha2 is required... | Одновременно отключены SHA1 и SHA2. | Включите хотя бы один алгоритм. |
file <path> is a directory | --file указывает на каталог, а не на файл. | Укажите путь к файлу, который нужно подписать. |
| Ошибка отметки времени, но файл подписи уже создан | Служба отметки времени недоступна или не удалось проверить цепочку сертификатов. | Проверьте URL отметки времени, при необходимости замените --timestamp-rfc3161. |