Inno Setup включает встроенную проверку целостности и подлинности ваших файлов, которая может быть выполнена при компиляции – перед включением файлов в установочный пакет или во время установки – перед копированием файлов в систему пользователя.
Подписи создаются при помощи утилиты Inno Setup Signature Tool (ISSigTool.exe) и хранятся в отдельных файлах с расширением .issig. Поскольку подписи записаны в отдельных файлах, оригинальные файлы остаются без изменений. Таким образом, любой тип файла может быть подписан и проверен.
Для создания подписей .issig не требуется сертификат от центра сертификации, что делает этот процесс совершенно бесплатным.
Обратите внимание, подписи .issig не могут быть использованы для устранения предупреждения «Неизвестный издатель», которое показывает Windows при запуске программы установки или другого EXE-файла. Для этого требуется совершенно другой тип цифровой подписи (Authenticode), встроенной в EXE-файл с помощью инструмента signtool.exe от Microsoft, а также сертификат, полученный от центра сертификации. Однако вы можете использовать для одного файла как signtool.exe, так и ISSigTool.exe, причем в указанном порядке. Дополнительную информацию о signtool.exe см. в разделе SignTool.
В командах issigtool, показанных ниже, укажите путь к Inno Setup и заключите его в кавычки. Например, "%ProgramFiles(x86)%\Inno Setup 6\issigtool".
Создайте файл закрытого ключа, который будет использоваться для подписи:
issigtool --key-file="MyKey.isprivatekey" generate-private-key
Файл с именем MyKey.isprivatekey будет создан в текущей папке. При необходимости можете указать для него желаемый путь.
Этот файл не следует передавать другим лицам или размещать в публичных хранилищах. Чтобы снизить риск случайного раскрытия данных, рекомендуется хранить его вне исходного кода проекта.
Создайте файл, который следует пописать, а затем создайте подпись:
echo Hello > MyFile.txt issigtool --key-file="MyKey.isprivatekey" sign "MyFile.txt"
Будет создан файл подписи с именем MyFile.txt.issig.
В сценарии Inno Setup добавьте секцию [ISSigKeys] с записью вашего файла закрытого ключа, а в секции [Files] для файла MyFile.txt укажите флаг issigverify:
[ISSigKeys] Name: MyKey; KeyFile: "MyKey.isprivatekey" [Files] Source: "MyFile.txt"; DestDir: "{app}"; Flags: issigverify
Примечание: здесь желательно указать файл открытого ключа; см. раздел Советы и рекомендации ниже.
Выполните сборку сценария. На вкладке вывода сообщений компилятора вы увидите строку с результатом успешной проверки файла:
Compressing: MyFile.txt Verification successful.
Теперь убедитесь, что компилятор действительно выявляет повреждение или подмену файла.
Измените содержимое MyFile.txt — напр. добавьте или измените один символ.
Попробуйте снова выполнить сборку сценария. На этот раз вы должны получить сообщение об ошибке, подобную следующей:
Signature is not valid for source file "MyFile.txt": file hash incorrect.
Процедура настройки проверки внешних файлов по существу аналогична описанной выше процедуре проверки во время компиляции, за исключением:
Запись в секции [Files] для параметра Source будет содержать путь и включать флаг external:
[Files] Source: "{src}\MyFile.txt"; DestDir: "{app}"; Flags: external issigverify
Файл подписи — MyFile.txt.issig в этом примере — должен находиться в том же каталоге, что и файл Source в процессе установки. (Проверка внешних файлов во время компиляции не производится.)
Несмотря на то что параметр KeyFile в секции [ISSigKeys] указывает на файл закрытого ключа, как показано в примере выше, рекомендуется по возможности указывать файл открытого ключа. В отличие от файла закрытого ключа, файл открытого ключа не нужно держать в секрете и он может безопасно храниться в системе контроля версий.
Чтобы создать файл открытого ключа (MyKey.ispublickey) из существующего файла закрытого ключа (MyKey.isprivatekey), выполните следующую команду:
issigtool --key-file="MyKey.isprivatekey" export-public-key "MyKey.ispublickey"
В качестве альтернативы, значения открытых ключей можно указать непосредственно в сценарии, используя параметры PublicX и PublicY вместо KeyFile.
Чтобы не повторять один и тот же параметр --key-file= при каждом вызове команды issigtool, можно установить переменную окружения ISSIGTOOL_KEY_FILE со значением пути к вашему файлу ключей.
В cmd.exe или пакетном файле:
set ISSIGTOOL_KEY_FILE=MyKey.isprivatekey
В оболочке PowerShell:
$env:ISSIGTOOL_KEY_FILE = "MyKey.isprivatekey"
Приведенные выше назначения переменных не являются постоянными; они влияют только на текущий сеанс cmd.exe или PowerShell.
После этого для создания подписей и проверки просто выполните следующие команды:
issigtool sign "MyFile.txt" issigtool verify "MyFile.txt"