Справочник по команде 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.
Настройка метки времени
Значения auto для --timestamp и --timestamp-rfc3161 на этапе проверки заменяются адресами по умолчанию:
| Параметр | Фактическое значение 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. |