Как создать подписанный деинсталлятор с помощью InnoSetup (ISCC.exe) и smctl.exe DigiCert?

Я использую smctl.exe для подписи настольного приложения на нашем сервере сборки. Я вызываю выполнение iscc.exe с моим файлом *.iss, включая параметр /S, следующим образом:

/Dsigning=true /Dbuildworkingdir=${bamboo.build.working.directory} ${bamboo.build.working.directory}\150_Software\10_SW\InnoSetup\EPCSetup.iss "/Ssigntool=smctl.exe sign --keypair-alias key_XXXXXXXX --input $f"

В результате получается правильно подписанный файл «setup.exe».

Это работает, пока в моем файле *.iss есть эта строка:

SignedUninstaller=no

Как только он переключится на SignedUninstaller=yes, сборка не удастся.

Вот соответствующий отрывок из «Бамбукового журнала»:

build   27-Sep-2023 08:09:20    Preparing Setup program executable
build   27-Sep-2023 08:09:20       Updating version info (SETUP.E32)
build   27-Sep-2023 08:09:21       Running Sign Tool signtool: C:\Program Files\DigiCert\DigiCert Keylocker Tools\smctl.exe sign --keypair-alias key_XXXXXXXXX --input "D:\Atlassian\ApplicationData\Bamboo\local-working-dir\360449\CFN-DIG-JOB1\150_Software\10_SW\InnoSetup\Output\uninst.e32.tmp"
build   27-Sep-2023 08:09:24    There were no files found for signing
error   27-Sep-2023 08:09:24    Error in D:\Atlassian\ApplicationData\Bamboo\local-working-dir\360449\CFN-DIG-JOB1\150_Software\10_SW\InnoSetup\EPCSetup.iss: The Sign Tool command returned an exit code of 0, but the file does not have a digital signature.
error   27-Sep-2023 08:09:24    Compile aborted.

Мои исследования показали, что smctl.exe использует для подписи Microsoftsigntool.exe. Signtool.exe может подписывать только исполняемые файлы.

Теперь я не могу идти дальше. InnoSetup хочет подписать «uninst.e32.tmp», но smctl.exe отказывается. Кто-нибудь знает об этой проблеме? Что я могу сделать? И еще: почему InnoSetup пытается подписать файл *.tmp?

Любые подсказки будут очень оценены.

Вы не опубликовали никаких доказательств проблемы. Вы получаете какую-то ошибку? Или что происходит? «Но smctl.exe отказывается» недостаточно.

Martin Prikryl 10.10.2023 08:36

Спасибо за совет Мартин Прикрыл. Я только что увеличил раздел журнала.

ebiondi 10.10.2023 09:13

Подпишется ли он, если переименовать файл в .exe (каким он является на самом деле)?

Martin Prikryl 10.10.2023 09:36

@MartinPrikryl Нет, я пробовал это. Но даже если бы это было возможно, это было бы бесполезно, поскольку InnoSetup запускает процесс подписи и не дает мне возможности контролировать имя файла.

ebiondi 10.10.2023 09:42

Вы имели в виду: «Я не пробовал»? + Это возможно. Вы можете написать скрипт (подойдет простой пакетный файл), который переименовывает файл, подписывает его и переименовывает обратно. И настройте этот сценарий/пакет как инструмент подписи в Inno Setup. Некоторые примеры см. в stackoverflow.com/q/69554187/850848#69556853 или stackoverflow.com/q/29067877/850848#29072495 + Если это не поможет, нам нужен минимальный воспроизводимый пример ( ни Bamboo, ни даже Inno Setup, просто прямая попытка подписать двоичный файл деинсталлятора.

Martin Prikryl 10.10.2023 10:06

Ты прав. Я попробовал наоборот. Я переименовал *.exe в *.tmp и попытался подписать его. Дурак я. Ваше предложение действительно работает. Попробую способ с пакетом. Спасибо уже большое.

ebiondi 10.10.2023 10:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
99
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

uninst.e32.tmp — это исполняемый файл, только с расширением .tmp.

Судя по сообщению об ошибке, похоже, что smctl даже не пытался подписать файл. Значит проблема не в самом файле, а возможно в его названии (расширении).

Переименование файла в .exe может решить проблему. Вы можете написать скрипт (подойдет простой пакетный файл), который переименовывает файл, подписывает его и переименовывает обратно. И настройте этот сценарий/пакет как инструмент подписи в Inno Setup.

Некоторые примеры таких пакетных файлов см.

Мне потребовалось некоторое время, чтобы запустить командный файл. У меня нет большого опыта работы с этим, а циклы тестирования на сервере сборки немного утомительны. Подписание деинсталлятора теперь работает. К сожалению, по-прежнему существует проблема с сообщением «Ошибка SignTool: файл используется другим процессом», но исходная проблема решена.

ebiondi 12.10.2023 11:34
Ответ принят как подходящий

Вы можете использовать настоящий инструмент подписи Microsoft с DigiCert, получив отпечаток SHA1 вашего сертификата DigiCert, а затем используя:

...\path\to\signtool.exe sign /sha1 <thumbprint> /tr http://timestamp.digicert.com /td sha256 /fd sha256 %1

где %1 обозначает файл для подписи.

Вы можете использовать Signtool при условии, что вы уже запустили инструмент настройки DigiCert smksp_cert_sync.exe, чтобы загрузить его метаданные о сертификатах, которые они хранят для вас. Это регистрирует их каким-то стандартным способом, который понимает Signtool. Поскольку вы используете smctl, я предполагаю, что это уже делается.

Я считаю, что вы можете получить отпечаток пальца, запустив («Пуск» > «Выполнить») certmgr.msc, чтобы просмотреть список всех сертификатов в разделе «Текущий пользователь \ Персональные \ Сертификаты».

Раньше я использовал подпись DigiCert для всего, включая заглушки деинсталлятора Inno, и это работало нормально.

Мне только что удалось успешно подписать ваши инструкции. Подпись, как вы написали, умеет подписывать и *.tmp файлы. Интеграция в процесс сборки InnoSetup прошла без проблем.

ebiondi 12.10.2023 14:44

Другие вопросы по теме