Иногда возникает необходимость снабдить разработанное приложение цифровой подписью. Это позволяет, например, контролировать целостность исполняемого файла приложения, подтвердить поставщика файла и т.д. В некоторых случаях наличие цифровой подписи является обязательным условием для запуска приложения. Например, драйверы режима ядра должны иметь валидную цифровую подпись для возможности запуска в 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 : Личное->Сертификаты.
Далее необходимо добавить сертификат в хранилище сертификатов доверенных корневых центров сертификации. Это можно сделать из командной строки:
certmgr -add AppCert.cer -s -r LocalMachine Root
Файл AppCert . cer должен находиться в текущей директории.
Те же действия можно произвести из графического интерфейса утилиты certmgr (для добавления сертификата для текущего пользователя) или certlm (для добавления для локальной машины). Для этого необходимо выбрать хранилище, куда будет помещен сертификат (Доверенные корневые центры сертификации). Далее выбрать Действия->Все задачи->Импорт. После успешного добавления сертификат появится в хранилище:
Теперь осталось только подписать исполняемый файл созданным сертификатом. Это делается при помощи утилиты signtool :
signtool sign /v /s MY /n "SuperCompany" /t http://timestamp.digicert.com /fd SHA256 "TestApp.exe"
Ключ / s задает имя хранилища, в котором содержится сертификат, / n - имя «организации», выдавшей сертификат, / t – URL сервера отметок времени,/ fd – используемая функция. Далее указывается
путь к подписываемому исполняемому файлу. Далее указывается путь к подписываемому исполняемому файлу.
Если данная команда завершилась успешно, то исполняемый файл TestApp.exe успешно подписан. В этом можно убедиться посмотрев свойства файла:
Также, при запуске от имени администратора вместо желтого окна UAC с предупреждением о неизвестном издателе будет показано окно с информацией о проверенном издателе и выведено его имя.