
Подпись кода — это процесс проставления цифровой подписи на программном обеспечении. Цифровая подпись гарантирует пользователю, что программа является неподдельной и что её код не подвергся никаким изменениям в промежутке между созданием программы и выпуском.
В старые времена для подписи билдов использовалась подписи 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 неподписанные приложения сопровождаются тревожными предупреждениями безопасности. Они сообщают, что издатель приложения неизвестен и что приложения рекомендуется устанавливать только из проверенных источников.