Как стать автором
Обновить
138.98

Автоматизация подписи кода в современных условиях

Время на прочтение4 мин
Количество просмотров1.3K


Подпись кода — это процесс проставления цифровой подписи на программном обеспечении. Цифровая подпись гарантирует пользователю, что программа является неподдельной и что её код не подвергся никаким изменениям в промежутке между созданием программы и выпуском.

В старые времена для подписи билдов использовалась подписи GPG, а секретные ключи хранились где-нибудь на флэшке. Потом для приложений Windows появились система Authenticode.

Сейчас для опенсорса и проприетарных ОС постепенно внедряются новые методы автоматизации подписи кода.

Для примера посмотрим, как это организовано в компании Mozilla, которая выпускает опенсорсное ПО.

Подпись кода в Mozilla


С первых версий Firefox все артефакты подписывали стандартными инструментами GPG и утилитой signcode.exe от Microsoft, которая требовала обязательного ввода парольной фразы. Ввод фразы в организации Mozilla автоматизировали с помощью инструмента автоматизации AutoIt, которая работала в фоновом режиме. Весь процесс описан в документации по подписи релизов.

Подписи GPG использовались для исполняемых файлов, библиотек и проч., а с помощью официального инструмента Authenticode изначально подписывались только инсталляторы Windows, затем и другие файлы.

Первая значительная попытка автоматизации состоялась при помощи скрипта Makefile, который скачивал, подписывал и загружал заново подписанные билды. В 2009 году процедуру сильно оптимизировали, сократив время для подписи всех артефактов с более чем восьми часов до менее 15-ти минут. Это удалось в том числе благодаря апгрейду рабочего компьютера на мощный четырёхъядерный процессор 2,5 ГГц с 4 ГБ RAM, распараллеливанию процесса, лучшему кэшированию файлов, внедрению python-скриптов и др. Впоследствии эти скрипты автоматизации стали фундаментом для следующего этапа автоматизации.

В 2011 году конвейер подписи кода в Mozilla полностью изменили, переместив его на безопасный Linux-сервер и внедрив API для подписи, чтобы не перемещать файлы с сервера на сервер в этом процессе. Подпись Windows-бинарников под Linux осуществляется с помощью нативной версии signcode и osslsigncode, это инструмент на базе OpenSSL для Authenticode-подписи файлов PE/MSI/Java CAB.

В 2018 году инфраструктура CI переместили с устаревшей системы Buildbot на фреймворк Taskcluster. Туда же в специализированные воркеры переехали задачи подписи кода, с внедрением цепочки доверия и специализированных скриптов для подписи.

Наконец, последней инновацией стало внедрение современного сервиса подписи кода Autograph с хранением приватных ключей в аппаратных модулях Hardware Security Module (HSM). К концу 2019-го года туда переехала все процессы для подписи немаковских файлов, а также расширений и обновлений браузера.


Сервис цифровой подписи Autograph

Что касается подписи под macOS, в 2024 году Mozilla начала использовать инструмент rcodesign и крейт apple-codesign для нотариального заверения билдов под Linux, чтобы перенести часть нагрузки с macOS-серверов в облако.

Подпись кода под Windows


Microsoft недавно организовала новый удостоверяющий центр Azure Trusted Signing. Пока он обслуживает только юридические лица, а программа для индивидуальных разработчиков находится на этапе Public Preview, цены начинаются от $9,99 в месяц.

Пример GitHub Action для подписи простого WPF-приложения с помощью Trusted Signing от Azure (он работает на виртуальных Windows-машинах, таких как windows-2022 и windows-2019 на хостинге GitHub):

on:
  push:
    branches: [main]

jobs:
  build-and-sign:
    runs-on: windows-latest
    name: Build app and sign files with Trusted Signing
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install dependencies
        run: dotnet restore App

      - name: Build
        run: dotnet build --configuration Release --no-restore WpfApp

      - name: Sign files with Trusted Signing
        uses: azure/trusted-signing-action@v0
        with:
          azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          azure-client-id: ${{ secrets.AZURE_CLIENT_ID }}
          azure-client-secret: ${{ secrets.AZURE_CLIENT_SECRET }}
          endpoint: https://eus.codesigning.azure.net/
          trusted-signing-account-name: vscx-codesigning
          certificate-profile-name: vscx-certificate-profile
          files-folder: ${{ github.workspace }}\App\App\bin\Release\net8.0-windows
          files-folder-filter: exe,dll
          file-digest: SHA256
          timestamp-rfc3161: http://timestamp.acs.microsoft.com
          timestamp-digest: SHA256

По сути, у разработчиков под Windows есть две опции: получить EV-сертификат для подписи кода от доверенного УЦ или использовать систему Trusted Signing от Azure.


Trusted Signing требует продвинутой проверки организации (занимает около недели), а сама фирма должны быть зарегистрирована не менее трёх лет назад.



Обычно независимым разработчикам и компаниям приходится внедрять собственные конвейеры для автоматизации подписи кода. Например, Mozilla сейчас использует свой фреймворк Autograph для генерации подписей и оепнсорсный инструмент osslsigncode для их добавления к файлам, а также питоновскую библиотеку Winsign, которая поддерживает подпись напрямую приватным ключом или вызов функции подписи (в данном случае это вызов Autograph) и официальные инструменты Microsoft для подписи MSIX.

Для некоторых разработчиков подпись кода — это вынужденная мера, потому что распространять неподписанные приложения сегодня считается признаком опасности. Например, в Windows неподписанные приложения сопровождаются тревожными предупреждениями безопасности. Они сообщают, что издатель приложения неизвестен и что приложения рекомендуется устанавливать только из проверенных источников.
Теги:
Хабы:
+5
Комментарии6

Публикации

Информация

Сайт
www.globalsign.com
Дата регистрации
Дата основания
1996
Численность
501–1 000 человек
Местоположение
Япония