Моя компания недавно была удивлена истечением срока действия сертификата подписи кода, и ей пришлось изо всех сил искать замену сертификату, только чтобы обнаружить, что с прошлого года сфера подписывания кода сместилась в сторону системы на основе USB-ключей, где сертификаты больше не используются. обычно доступны напрямую. Изучая альтернативы, мы остановились на новой службе доверенной подписи Azure, которая предлагает своего рода «подпись как услугу», и мы смогли настроить наш процесс сборки так, чтобы использовать его достаточно эффективно в контексте Windows. Теперь мы хотим правильно включить его в наш современный конвейер CI/CD, но несколько лет назад мы перешли на время сборки и выполнения Linux, и похоже, что не существует очевидного способа вызвать Azure Trusted Signing из среды выполнения Linux. .
Основной поддерживаемый способ (согласно документации здесь https://learn.microsoft.com/en-us/azure/trusted-signing/how-to-signing-integrations), по-видимому, заключается в использовании специальной версии Signtool.exe, который, похоже, загружает отдельную библиотеку MS, которая отправляет веб-запрос к ресурсу подписи в Azure. Это то, что я раньше работал, и, похоже, это то, что скрыто под всеми перечисленными альтернативами (github/Azure Devops action, powershell, sdk), но все они кажутся совершенно новыми и не имеют никакой документации/инструкций и никого. еще спрашиваю о них, и ни один из них не работает вне контекста Windows.
Я попытался использовать Wine 9 для запуска моей рабочей установки Signtool.exe из контекста Ubuntu 20.04 с чистой установкой, но я получил ошибку, которую не могу понять, как устранить:
wine "./Microsoft.Windows.SDK.BuildTools_10.0.22621.0/signtool.exe" sign /debug /v /fd SHA256 /tr "http://timestamp.acs.microsoft.com" /td SHA256 /dlib "./Microsoft.Trusted.Signing.Client_1.0.53/Azure.CodeSigning.Dlib.dll" /dmdf "./signinfo.json" "/home/asdf.exe"
007c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
007c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
007c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
007c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
00f8:err:module:import_dll Library MFC42.dll (which is needed by L"Z:\\home\\Microsoft.Windows.SDK.BuildTools_10.0.22621.0\\signtool.exe") not found
00f8:err:module:loader_init Importing dlls for L"Z:\\home\\Microsoft.Windows.SDK.BuildTools_10.0.22621.0\\signtool.exe" failed, status c0000135
Я успешно запустил Winetricks mfc42 и убедился, что .dll находится в виртуальной папке syswow64, и попытался переместить папку, содержащую ресурсы Signtool, в каталог виртуальных программных файлов, но все безрезультатно. Версия Signtool.exe, которую я использую, является 64-битной, и я убедился, что моя установка Wine работает, без проблем запустив Wine notepad.exe.
В качестве обходного пути я сейчас работаю над функцией Azure, которую моя сборка может вызывать, когда придет время подписывать .exe-файлы (все для того, чтобы я мог находиться в контексте Windows), но это представляет собой огромный риск для безопасности, поскольку я по сути, просто создаю URL-адрес, по которому любой, кто находится за моим брандмауэром, может нажать, чтобы подписать все, что он хочет.
Почему использование Wine для запуска Signtool.exe не работает? Есть ли лучший способ выполнить то, что я пытаюсь сделать, предполагая, что я не хочу переключаться на другого поставщика подписи кода и хочу продолжать использовать доверенную подпись Azure?





Доверенная подпись Azure поддерживается Jsign, кроссплатформенной альтернативой Signtool.exe с открытым исходным кодом. Вино не требуется. Синтаксис выглядит следующим образом:
jsign --storetype TRUSTEDSIGNING \
--keystore weu.codesigning.azure.net \
--storepass <api-access-token> \
--alias <account>/<profile> application.exe
Поддержка доверенной подписи Azure станет частью предстоящего выпуска 7.0. Тем временем вам придется создать проект самостоятельно (с помощью mvn package -DskipTests) или загрузить последние артефакты CI с GitHub Actions.
(Отказ от ответственности: я являюсь автором этого проекта)
Я взял версию SHAPSHOT 7.0 с сайта GitHub, и она сработала просто великолепно! Спасибо! Выполнение вызовов веб-запросов самостоятельно кажется наиболее разумным вариантом для реализации независимого от платформы доверенного клиента подписи.