Я использую 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?
Любые подсказки будут очень оценены.
Спасибо за совет Мартин Прикрыл. Я только что увеличил раздел журнала.
Подпишется ли он, если переименовать файл в .exe (каким он является на самом деле)?
@MartinPrikryl Нет, я пробовал это. Но даже если бы это было возможно, это было бы бесполезно, поскольку InnoSetup запускает процесс подписи и не дает мне возможности контролировать имя файла.
Вы имели в виду: «Я не пробовал»? + Это возможно. Вы можете написать скрипт (подойдет простой пакетный файл), который переименовывает файл, подписывает его и переименовывает обратно. И настройте этот сценарий/пакет как инструмент подписи в Inno Setup. Некоторые примеры см. в stackoverflow.com/q/69554187/850848#69556853 или stackoverflow.com/q/29067877/850848#29072495 + Если это не поможет, нам нужен минимальный воспроизводимый пример ( ни Bamboo, ни даже Inno Setup, просто прямая попытка подписать двоичный файл деинсталлятора.
Ты прав. Я попробовал наоборот. Я переименовал *.exe в *.tmp и попытался подписать его. Дурак я. Ваше предложение действительно работает. Попробую способ с пакетом. Спасибо уже большое.





uninst.e32.tmp — это исполняемый файл, только с расширением .tmp.
Судя по сообщению об ошибке, похоже, что smctl даже не пытался подписать файл. Значит проблема не в самом файле, а возможно в его названии (расширении).
Переименование файла в .exe может решить проблему. Вы можете написать скрипт (подойдет простой пакетный файл), который переименовывает файл, подписывает его и переименовывает обратно. И настройте этот сценарий/пакет как инструмент подписи в Inno Setup.
Некоторые примеры таких пакетных файлов см.
Мне потребовалось некоторое время, чтобы запустить командный файл. У меня нет большого опыта работы с этим, а циклы тестирования на сервере сборки немного утомительны. Подписание деинсталлятора теперь работает. К сожалению, по-прежнему существует проблема с сообщением «Ошибка SignTool: файл используется другим процессом», но исходная проблема решена.
Вы можете использовать настоящий инструмент подписи 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 прошла без проблем.
Вы не опубликовали никаких доказательств проблемы. Вы получаете какую-то ошибку? Или что происходит? «Но smctl.exe отказывается» недостаточно.