В мире разработки приложений для Windows, упаковка в формат MSIX становится все более популярной. Этот формат предлагает современные возможности развертывания и обновления, но процесс подписи пакетов иногда может вызывать затруднения. В частности, пользователи Delphi и Pascal могут столкнуться с ситуацией, когда стандартный инструмент SignTool отказывается подписывать MSIX пакет, созданный в среде разработки.
Проблема:
Как показывает пример из обсуждения, ошибка при подписи MSIX пакета с помощью SignTool может выглядеть так:
SignTool Error: This file format cannot be signed because it is not recognized.
Или, в другом варианте:
SignTool Error: An unexpected internal error has occurred.
Error information: "Error: SignerSign() failed." (-2147024885/0x8007000b)
При этом, подпись обычных исполняемых файлов (.exe) проходит успешно, и сам процесс создания MSIX пакета (например, с помощью makeappx) не вызывает проблем.
Решение, предложенное в обсуждении:
В приведенном обсуждении, автор смог решить проблему, используя сторонний инструмент под названием MSIX Hero (https://github.com/marcinotorowski/MSIX-Hero). Этот инструмент успешно подписал тестовый MSIX пакет, что позволило продолжить работу.
Альтернативные решения и возможные причины:
Хотя MSIX Hero и помог в конкретном случае, существуют и другие возможные причины и решения проблемы, связанные с подписью MSIX пакетов:
Версия SignTool: Убедитесь, что вы используете последнюю версию SignTool из Windows SDK. Разные версии могут иметь различную поддержку форматов и алгоритмов. Как видно из обсуждения, использование более старой версии SignTool приводило к другой ошибке.
Некорректные параметры SignTool: Проверьте правильность параметров, передаваемых SignTool. Особенно важны параметры, определяющие алгоритм хеширования (/fd SHA256 или /fd SHA1), алгоритм подписи (/a для автоматического выбора лучшего сертификата) и сервер меток времени (/tr для добавления метки времени, что рекомендуется для долгосрочной валидности подписи). Пример команды:
Замените "YourApp.msix" на имя вашего MSIX пакета, а "http://timestamp.digicert.com" на подходящий сервер меток времени (например, "https://time.certum.pl" для Certum).
Проблемы с сертификатом: Убедитесь, что сертификат, который вы пытаетесь использовать, действителен, установлен в хранилище сертификатов и имеет необходимые разрешения для подписи кода. Проверьте, не истек ли срок действия сертификата.
Неправильная структура MSIX пакета: Хотя автор утверждает, что AppManifest.xml в порядке, стоит еще раз тщательно проверить его на соответствие схеме MSIX. Неправильные атрибуты или отсутствующие элементы могут приводить к проблемам при подписи.
Антивирусное ПО: В редких случаях, антивирусное программное обеспечение может блокировать процесс подписи. Попробуйте временно отключить антивирус и повторить попытку.
Альтернативные инструменты подписи: Помимо MSIX Hero, существуют и другие инструменты для подписи MSIX пакетов, например, Signotaur (упомянут в обсуждении). Они могут предложить более удобный интерфейс или поддержку специфических типов сертификатов (например, хранящихся на токенах).
Пример кода на Delphi (Object Pascal):
Хотя Delphi не предоставляет встроенных средств для подписи MSIX пакетов, вы можете использовать функции ShellExecute или CreateProcess для вызова SignTool из вашего приложения. Пример:
uses
System.Diagnostics;
procedure SignMsixPackage(const MsixFilePath, CertificateSubjectName: string);
var
StartInfo: TProcessStartInfo;
Process: TProcess;
ExitCode: Integer;
begin
StartInfo := TProcessStartInfo.Create;
try
StartInfo.FileName := '"C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x64\signtool.exe"'; // Укажите правильный путь к SignTool
StartInfo.Arguments := Format('sign /v /a /fd SHA256 /tr "http://timestamp.digicert.com" /td SHA256 "%s"', [MsixFilePath]);
StartInfo.UseShellExecute := False;
StartInfo.RedirectStandardOutput := True;
StartInfo.RedirectStandardError := True;
StartInfo.CreateNoWindow := True;
Process := TProcess.Create(nil);
try
Process.StartInfo := StartInfo;
Process.Start;
Process.WaitForExit;
ExitCode := Process.ExitCode;
// Вывод результатов подписи (для отладки)
Memo1.Lines.Add(Process.StandardOutput.ReadToEnd);
Memo1.Lines.Add(Process.StandardError.ReadToEnd);
if ExitCode <> 0 then
ShowMessage('Ошибка при подписи MSIX пакета. Код ошибки: ' + IntToStr(ExitCode));
finally
Process.Free;
end;
finally
StartInfo.Free;
end;
end;
// Пример использования:
procedure TForm1.Button1Click(Sender: TObject);
begin
SignMsixPackage('C:\Path\To\Your\App.msix', 'Your Certificate Subject Name'); // Замените на ваши значения
end;
Важно: Этот код требует указания правильного пути к SignTool и имени субъекта сертификата. Также, необходима обработка ошибок и вывод результатов подписи для отладки.
Заключение:
Подпись MSIX пакетов может быть сложной задачей, но, разобравшись с возможными причинами и решениями, можно успешно автоматизировать этот процесс в ваших проектах на Delphi и Pascal. Использование сторонних инструментов, таких как MSIX Hero, может упростить задачу, но важно понимать основы работы с SignTool и сертификатами для решения проблем, которые могут возникнуть.
В контексте описывается проблема, когда SignTool не может подписать MSIX пакет, созданный в Delphi или Pascal, и предлагаются решения, включая использование стороннего инструмента MSIX Hero и проверку различных параметров SignTool, сертификата и структур
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.