Подписывание исполняемых файлов

Иногда возникает необходимость снабдить разработанное приложение цифровой подписью. Это позволяет, например, контролировать целостность исполняемого файла приложения, подтвердить поставщика файла и т.д. В некоторых случаях наличие цифровой подписи является обязательным условием для запуска приложения. Например, драйверы режима ядра должны иметь валидную цифровую подпись для возможности запуска в 64-битных ОС Windows, начиная с Windows Vista.

Есть два пути: купить сертификат у одного из удостоверяющих центров либо обойтись самоподписанным сертификатом. Отличие «глобального» сертификата от самоподписанного заключается в том, что самоподписанный должен быть вручную добавлен в соответствующее хранилище сертификатов. Кроме того, если таким сертификатом подписан драйвер режима ядра, то для возможности его запуска в операционной системе должен быть включен тестовый режим.

В целях контроля целостности на личном компьютере или локальной сети для юзермодных приложений подойдет и самоподписанный сертификат.

Для создания сертификата воспользуемся утилитой makecert , запущенной от имени администратора в Visual Studio Developer Command Prompt :

makecert -r -pe -n "CN=SuperCompany" -ss MY AppCert.cer

После выполнения этой команды в текущей директории будет создан файл сертификата с именем AppCert . cer . SuperCompany – название «организации», выдавшей сертификат. MY – название хранилища, куда будет помещен сертификат. В данном случае это приватное хранилище текущего пользователя. Увидеть сертификат можно запустив приложение certmgr : Личное->Сертификаты.

image

Далее необходимо добавить сертификат в хранилище сертификатов доверенных корневых центров сертификации. Это можно сделать из командной строки:

certmgr -add AppCert.cer -s -r LocalMachine Root

Файл AppCert . cer должен находиться в текущей директории.

Те же действия можно произвести из графического интерфейса утилиты certmgr (для добавления сертификата для текущего пользователя) или certlm (для добавления для локальной машины). Для этого необходимо выбрать хранилище, куда будет помещен сертификат (Доверенные корневые центры сертификации). Далее выбрать Действия->Все задачи->Импорт. После успешного добавления сертификат появится в хранилище:

image

Теперь осталось только подписать исполняемый файл созданным сертификатом. Это делается при помощи утилиты signtool :

signtool sign /v /s MY /n "SuperCompany" /t http://timestamp.digicert.com "TestApp.exe"

Ключ / s задает имя хранилища, в котором содержится сертификат, / n - имя «организации», выдавшей сертификат, / t – URL сервера отметок времени. Далее указывается путь к подписываемому исполняемому файлу.

Если данная команда завершилась успешно, то исполняемый файл TestApp.exe успешно подписан. В этом можно убедиться посмотрев свойства файла:

image

image

Также, при запуске от имени администратора вместо желтого окна UAC с предупреждением о неизвестном издателе будет показано окно с информацией о проверенном издателе и выведено его имя.

image

2 симпатии

Интересно, там до сих пор не появилось бесплатных центров типа как Let’s Encrypt для веба?

Какое-то стремное ущемление разработчиков мелких/бесплатных приложений. Отдавать пару сотен $ в год они обычно не могут/не хотят, но SmartScreen при запуске после скачивания нередко ругается на них за это. :donald:

Насколько я знаю, нет. Это было бы чудесным подарком для малварщиков. Лет 10 назад слышал про инициативу, в рамках которой можно было подписать свой драйвер бесплатно, если предоставить исходники (видимо, для проверки, что там нет вредоносов), но потом это прикрыли.
Слышал, у некоторых CA были скидки, если софт был Open Source.
Кстати, у больших вендоров тоже не всегда весь софт подписан, даже тот, который требует админских прав, инсталлятор, например.

Такой вариант сохранения сертификата в хранилище подойдет для очень продвинутого юзера.
Рядовой пользователь таке не провернет :frowning:

P. S.
Это разве что в установщик драйвера добавить cmd и запускать от имени администратора.

Да, тут 70 евро в год вместо 160.

И какое-то начинание под именем Sigstore, но понятно пока ни в каком списке Майкрософта его нет и т.д., сейчас вроде бы оно только для каких-то линуксоидных целей.

А смысл пользователю это делать?
Самоподписанные скорее для тестирования во время разработки, если по каким-то причинам что-то требует сертификат. Или может для каких-то случаев использования внутри компании.

С драйвером для обычного пользователя еще сложнее, т.к. надо будет предварительно включать тестовый режим в ОС, для того, чтобы ядерный модуль с самоподписанным сертификатом мог быть выполнен.