Как подписать приложение windows
SignTool — это средство командной строки, используемое для цифровой подписи пакета приложения или пакета приложений с помощью сертификата. Сертификат может быть создан пользователем (для тестирования) или выдан компанией (для распространения). Подписывание пакета приложения дает пользователю средство проверки отсутствия изменений в данных приложения после его подписи, при этом также подтверждается подлинность пользователя или компании, подписавшего пакет. SignTool может подписать зашифрованные и незашифрованные пакеты приложения и пакеты приложений.
Если для разработки приложения использовали Visual Studio, рекомендуется применять мастер Visual Studio для создания и подписывания пакета приложения. дополнительные сведения см. в статьях упаковка приложения UWP с Visual Studio и упаковка классического приложения из исходного кода с помощью Visual Studio.
Дополнительные сведения о подписи кода и сертификатах в целом см. в разделе Знакомство с процессом подписания кода.
Предварительные требования
Упакованное приложение
Подробнее о ручном создании пакета приложения, создания пакета приложения с помощью средства MakeAppx.exe.
Действительный сертификат подписи
Дополнительные сведения о создании или импорте действительного сертификата подписи см. в разделе Создание или импорт сертификата для подписания пакета.
SignTool.exe
В зависимости от пути установки пакета SDK SignTool может находиться в следующих расположениях на компьютере с Windows 10:
- x86: C:\Program files (x86) \ Windows < пакет sdk Kits\10\bin\ версии >\x86\SignTool.exe
- x64: C:\Program files (x86) \ Windows < пакет sdk Kits\10\bin\ версии >\x64\SignTool.exe
Применение SignTool
SignTool может использоваться для подписывания файлов, проверки подписей и меток времени, удаления подписей и другого. Так как нас интересует подписывание пакета приложения, мы рассмотрим команду sign. Подробные сведения об инструменте SignTool см. на справочной странице SignTool.
Определение хэш-алгоритма
При использовании SignTool для подписи пакета приложения или пакета приложений, хэш-алгоритм, применяемый в SignTool, должен совпадать с алгоритмом, использованном для упаковки приложения. Например, если вы применили MakeAppx.exe для создания пакета приложения с параметрами по умолчанию, то необходимо выбрать SHA256 в SignTool, поскольку это алгоритм, по умолчанию используемый в MakeAppx.exe.
Чтобы узнать, какой алгоритм хэширования применялся при упаковке приложения, извлеките содержимое пакета и изучите файл AppxBlockMap.xml. Инструкции по распаковке/извлечению пакета приложения см. в разделе Извлечение файлов из пакета приложения или пакета приложений. Хэш-метод указан в элементе BlockMap и имеет следующий формат:
В этой таблице показан каждое значение HashMethod и соответствующий хэш-алгоритм:
Так как в SignTool по умолчанию применяется алгоритм SHA1 (которого нет в MakeAppx.exe), вам всегда необходимо указывать хэш-алгоритм при использовании SignTool.
Подпись пакета приложения
Если у вас есть все необходимые компоненты и вы определили, какой хэш-алгоритм применялся для упаковки приложения, то вы готовы подписать его.
Общий синтаксис командной строки при подписи пакета с помощью SignTool таков:
Сертификат, используемый для подписания приложения, должен быть либо PFX-файлом либо установлен в хранилище сертификатов.
Чтобы подписать пакет приложения с помощью сертификата из PFX-файла, примените следующий синтаксис:
Обратите внимание, что параметр /a позволяет /a автоматически выбрать наиболее подходящий сертификат.
Если ваш сертификат не является PFX-файлом, используйте следующий синтаксис:
Кроме того, вы можете указать хэш SHA1 нужного сертификата вместо <Имя сертификата>, с помощью следующего синтаксиса:
Обратите внимание, что с некоторыми сертификатами пароль не используется. Если для вашего сертификата не требуется пароль, опустите параметр "/p <Ваш пароль>" в примерах команд.
Цифровая подпись предназначена для того, чтобы указать автора программы и показать, что данная программа или файл не был изменен другими лицами. Если кто-то попробует модифицировать подписанную программу, то цифровая подпись сразу становится недействительной. Это главное предназначение цифровой подписи.
Второе преимущество подписанных программ и инсталляций состоит в том, что антивирусные программы более лояльно относятся к подписанным приложениям. Ложные срабатывания и необоснованные попадания в карантин у подписанных программ встречаются реже.
Неподписанная инсталляция
Подписанная инсталляция
Как получить цифровую подпись
Цифровую подпись можно купить у специальных организаций. Например, Comodo, Verisign (Symantec). Сертификат можно приобрести как на один год, так и на несколько лет. Цены начинаются от $100-150 за один год, но через партнеров можно купить сертификат дешевле. Например, KSoftware, являсь стратегическим партнером Comodo, продают сертификаты за $95 в год и есть скидки при его покупке на несколько лет. После того как вы произвели оплату, сотрудники соответствующей организации удостоверятся, что вы являетесь именно тем лицом или организацией на чье имя выдается цифровая подпись. Когда все данные проверены, вам будет дана ссылка, по которой вы загрузите сертификат в Internet Explorer и затем вам нужно сохранить его в виде файла с расширением .pfx, также у вас должен быть пароль, который вы указывали при формировании заявки на сертификат.
Как подписывать программы с помощью цифровой подписи
kSign
kSignCMD
Как подписывать инсталляции в инсталляторе CreateInstall
Конечно, можно самостоятельно подписывать инсталляции созданные CreateInstall, но лучше автоматизировать этот процесс. К тому же, наш инсталлятор позволяет подписывать uninstall.exe и update.exe, которые будут потом распакованы при установке вашей программы на компьютер пользователя. Рассмотрим следующее решение с использованием утилиты kSignCMD.exe, которая входит в программу kSign. Создайте .bat файл примерно следующего содержания и сохраните его в секретном месте. Самое главное, чтобы он был доступен в момент сборки вашего дистрибутива. [pfxfile] замените на полный путь к вашему .pfx файлу, а [password] замените на ваш пароль. Команда pause нужна, чтобы вы могли вовремя обнаружить ошибку, которая может возникнуть при попытке подписать приложение. С другой стороны, из-за этой команды вам придется нажимать на какую-нибудь клавишу для продолжения процесса создания дистрибутива.
Сейчас откройте ваш проект в CreateInstall и перейдите к закладке Проект - страница Setup Builder. В поле Application for Code Signing укажите полный путь к созданному нами .bat файлу. Он будет запускаться когда потребуется подписать приложение. Далее укажите параметры для подписывания дистрибутива, деинсталлятора и программы проверки обновлений. Первым параметром должно быть определено общее наименование программы, а вторым , который будет автоматически заменен на полный путь к подписываемому приложению. Например, значения могут быть следующими:
В данном случае, CreateInstall вызовет наш .bat файл для подписывания установки, деинсталлятора и программы обновления, если вы включаете ее в свой проект.
Смотрите также
Eonza automation software - free, open source cross-platform program for easy creation and management of scripts. Gentee script programming language - Free, open source and cross-platform programming language for automation.Что такое цифровая подпись для программы
Подпись программы – это процесс добавления специального кода (электронной подписи) к исполняемым файлам и драйверам на этапе разработки.
Электронная подпись позволяет пользователям убедиться, что данная программа:
- подписана именно данным автором, и
- не была изменена или повреждена после подписания.
Электронная подпись для программы также может содержать информацию о версии или другие метаданные. По сути это цифровой аналог обычной рукописной подписи и печати.
Польза от подписания программ для пользователей состоит в том, что они знают, кем было опубликовано данное ПО, и что оно не было изменено. Для разработчиков же это выгодно тем, что их программам доверяют, и подделать их труднее.
Как правило, подписывается не сам исполняемый файл, а его хэш-сумма. Это позволяет уменьшить размер цифровой подписи.
- Создать подпись можно только с помощью закрытого ключа, известного только владельцу подписи.
- При любом изменении программы изменяется ее хэш-сумма, и подпись становится недействительной, о чем выдается соответствующее предупреждение.
Для чего используется
Электронная подпись используется в большинстве криптографических протоколов, применяется для распространения ПО, в финансовых транзакциях и других операциях, для которых важно уметь распознать случаи фальсификации.
Наиболее частое применение подписи программного кода – обеспечение безопасности при установке программы. Например, файлы обновлений операционных систем содержат подписи компании-разработчика, чтобы принимающая система могла убедиться в целостности файлов и в том, что они действительно созданы данным производителем, даже если обновления доставляются через третьи лица (скачиваются с сайта дистрибьютора или устанавливаются с дисков).
Как получать цифровую подпись для программы
Электронные подписи создаются с помощью алгоритма подписи с открытым ключом, например, RSA. В алгоритме с открытым ключом на самом деле используются два различных ключа: открытый и закрытый. Закрытый ключ знает только его владелец, а открытый ключ доступен всем. В технологии электронной подписи с помощью закрытого ключа генерируется подпись, а соответствующий ему открытый ключ используется для её проверки.
Чтобы получить электронную подпись, необходимо обратиться в специальный центр сертификации (или удостоверяющий центр). Центр сертификации выдаёт ключи (закрытый и открытый) и сертификат (собственно подпись).
С помощью закрытого ключа разработчик вычисляет хэш-сумму своего кода (в специальном ПО или через веб-сайт), прикрепляет хэш-сумму и сертификат к коду и компилирует его – получается подписанная программа.
- уникальный номер;
- дата начала и окончания срока действия;
- данные о владельце;
- уникальный ключ проверки сертификата (открытый);
- название используемой подписи или стандарты, которым она соответствуют;
- название центра сертификации.
- срок действия ключа;
- отсутствие ключа в списке отозванных;
- факт выдачи ключа авторизованным центром сертификации.
Помимо выдачи ключей и сертификатов, центр сертификации отзывает истёкшие или скомпрометированные сертификаты и ведёт соответствующие базы данных.
Существует также вариант, при котором разработчик внедряет в код свою собственную, личную подпись. Конечному пользователю в этом случае необходимо получить открытый ключ непосредственно у разработчика, чтобы выполнить проверку ПО при первом запуске.
Кроме программной реализации цифровой подписи, существует также её аппаратная реализация (например, с помощью смарт-карт, USB-токенов и т.п.).
Однако само по себе наличие цифровой подписи в программе не гарантирует, что последняя безопасна. Наличие подписи говорит о том, что программа была получена из данного источника и не была изменена после того, как была подписана. Доверять источнику программы или нет, решает сам пользователь.
Лицензирование программ
Лицензирование позволяет из написанной программы сделать продукт, пригодный для продажи. Как и с цифровой подписью, разработчик может попытаться создать собственные механизмы или подключиться к существующим системам. Как правило, такие системы позволяют оперативно запустить продажи на основе распространения дистрибутива и серийных номеров, а также обеспечивают защиту от копирования, взлома и модификации.
Все 64 битные версии Windows, начиная с Windows 7, по умолчанию запрещают установку драйверов устройств, которые не подписаны с помощью корректной цифровой подписи. Неподписанные драйвер блокируются операционной системой. Наличие цифровой подписи гарантирует (в какой-то мере), что драйвер выпущен конкретным разработчиком или вендором, а его код не был модифицирован после того, как он был подписан.
В Windows 10/7 x64 существует несколько способов отключить проверку цифровой подписи устанавливаемого драйвера: с помощью групповой политики или тестового режима загрузки системы (подробнее все способы описаны в статье Отключаем проверку цифровой подписи для установки неподписанных драйверов в Windows).
Сегодня мы покажем, как можно самостоятельно подписать любой неподписанный драйвер для 64 битной версии Windows 10 или Windows 7.
Предположим, что у нас имеется драйвер некого устройства для x64 Windows 10 или Windows 7, у которого отсутствует цифровая подпись (в нашем примере это будет драйвер для довольно старой видеокарты). Архив с драйверами под нашу версию Windows (мне удалось найти драйвер для Windows Vista x64) был скачан с сайта производителя и его содержимое распаковано в каталог c:\tools\drv1\. Попробуем установить драйвер, добавив его в хранилище драйверов Windows с помощью стандартной утилиты pnputil.
Pnputil –a "C:\tools\drv1\xg20gr.inf"
Примечание. Эта и все последующие команды выполняются в командной строке, запущенной с правами администратора.В процессе его установки Windows 7 отобразит предупреждение о том, что система не может проверить цифровую подпись данного драйвера.
В Windows 10 такое предупреждение даже не появляется, а в консоли появляется предупреждение, что в стороннем INF файле отсутствует информация о цифровой подписи.
При попытке установить драйвер из проводника Windows, если вы щелкните ПКМ по inf файлу драйвера и выберите Install / Установить появится ошибка:
The third-party INF does not contain digital signature information.
INF стороннего производителя не содержит информации о подписи.
Попробуем подписать данный драйвер с помощью самоподписанного сертификата.
Утилиты, необходимые для подписывания драйвера
Для работы нам понадобится скачать и установить (с настройками по умолчанию) следующие инструменты разработчика приложений для Windows.
Создаем самоподписанный сертификат и закрытый ключ
Создадим в корне диска каталог C:\DriverCert.
Откроем командную строку и перейдем в следующий каталог:
cd C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1\bin
Создадим самоподписанный сертификат и закрытый ключ, выданный, допустим, для компании Winitpro:
makecert -r -sv C:\DriverCert\myDrivers.pvk -n CN="Winitpro" C:\DriverCert\MyDrivers.cer
Во время создания утилита попросит указать пароль для ключа, пусть это будет P@ss0wrd.
На основе созданного сертификата создадим публичный ключ для сертификата издателя ПО (PKCS).
cert2spc C:\DriverCert\myDrivers.cer C:\DriverCert\myDrivers.spc
Объединим публичный ключ (.spc) и персональный ключ (.pvk) в одном файле сертификата формата Personal Information Exchange (.pfx).
pvk2pfx -pvk C:\DriverCert\myDrivers.pvk -pi P@ss0wrd -spc C:\DriverCert\myDrivers.spc -pfx C:\DriverCert\myDrivers.pfx -po P@ss0wrd
$cert = New-SelfSignedCertificate -Subject "Winitpro” -Type CodeSigningCert -CertStoreLocation cert:\LocalMachine\My
Затем нужно экспортировать данный сертфикат в pfx файл с паролем:
$CertPassword = ConvertTo-SecureString -String “P@ss0wrd” -Force –AsPlainText
Export-PfxCertificate -Cert $cert -FilePath C:\DriverCert\myDrivers.pfx -Password $CertPassword
Генерируем CAT файл драйвера
Создадим каталог C:\DriverCert\xg и скопируем в него все файлы из каталога, в который первоначально был распакован архив с драйвером (c:\tools\drv1\). Убедить что среди файлов имеются файлы с расширением .sys и .inf (в нашем случае xg20grp.sys и xg20gr).
Перейдем в каталог:
На основе inf файла с помощью утилиты inf2cat.exe (входит в состав Windows Driver Kit -WDK) сгенерируем для нашей платформы cat файл (содержит информацию о всех файлах пакета драйвера).
inf2cat.exe /driver:"C:\DriverCert\xg" /os:7_X64 /verbose
Signability test complete .
и
Catalog generation complete .
Signability test failed.
22.9.7: DriverVer set to incorrect date (must be postdated to 4/21/2009 for newest OS) in \hdx861a.inf
Для исправления ошибки нужно в секции [Version] найти строку с DriverVer= и заменить ее на:
После выполнения команды в каталоге драйвера должен обновиться файл g20gr.cat
Подписываем драйвер самоподписанным сертификатом
Перейдите в каталог:
cd "C:\Program Files (x86)\Windows Kits\10\bin\10.0.17134.0\x64"
Подпишем комплект файлов драйвера созданным нами сертификатом, в качестве сервиса таймстампа (штамп времени) воспользуемся ресурсом Globalsign. Следующая команда подпишет CAT файл цифровой подписью с помощью сертификата, хранящегося в PFX-файл, защищенном паролем.
signtool sign /f C:\DriverCert\myDrivers.pfx /p P@ss0wrd /t http://timestamp.globalsign.com/scripts/timstamp.dll /v "C:\DriverCert\xg\xg20gr.cat"
Если файл подписан успешно, должна появится надпись:
Successfully signed: C:\DriverCert\xg\xg20gr.cat
Number of files successfully Signed: 1
SignTool verify /v /pa c:\DriverCert\xg\xg20gr.cat
Лидо в свойствах файла на вкладке Digital Signatures.
CAT файл содержит цифровые подписи (отпечатки / thumbprints) всех файлов, которые находятся в каталоге драйвера (файлов, которые указаны в INF файле в секции CopyFiles). Если любой из этих файлов был изменен, то контрольная сумма файлов не будет совпадать с данными в CAT файле, в результате установка такого драйвера закончится ошибкой.
Установка сертификата
Т.к. созданный нами сертификат является самоподписанным, система по-умолчанию ему не доверяет. Добавим наш сертификат в локальное хранилище сертификатов. Сделать это можно с помощью команд:
certmgr.exe -add C:\DriverCert\myDrivers.cer -s -r localMachine ROOT
certmgr.exe -add C:\DriverCert\myDrivers.cer -s -r localMachine TRUSTEDPUBLISHER
Или из графического мастера добавления сертификатов (сертификат нужно поместить в хранилища Trusted Publishers и Trusted Root Certification Authorities локальной машины). В домене вы можете централизованно распространить этот сертификат на рабочие станции с помощью групповой политики.
Установка драйвера, заверенного самоподписанным сертификатом
Попробуем еще раз установить подписанный нами драйвер, выполнив команду:
Pnputil –i –a C:\DriverCert\xg20\xg20gr.inf
Теперь в процессе установки драйвера, окна-предупреждения об отсутствующей цифровой подписи драйвера не появится.
Successfully installed the driver on a device on the system.
Driver package added successfully.
В Windows 7 появляется такое предупреждение. о том, уверены ли вы, что хотите установить этот драйвер (в Windows 10 x64 1803 такое всплывающее окно не появляется). Нажав «Install», вы установите драйвер в системе.
Если установка драйвера прошла успешно, в файле setupapi.dev.log будут примерно такие строки:
Как вы видите, для установки самоподписанного драйвера нам даже не пришлось отключать проверку цифровой подписи драйверов с помощью bcdedit.exe, как описано здесь (команды bcdedit.exe /set loadoptions DISABLE_INTEGRITY_CHECKS и bcdedit.exe /set testsigning ON ).
Предыдущая статья Следующая статьяИнструкция отличнейшая. наконец то можно будет нормально обходится без виртуальной машины 32 битной , спасибо.
Попробовал. Получилось отлично. У драйвера показывает цифровую подпись. Установилось через devcon без всяких всплывающих окошек.
Через pnputil тоже нормально.
Спасибо за мануал. Успешно подписал TAP драйвер к OpenVPN. Ставится без проблем
Это боты-накрутчики успешно установили? Только что сделал всё по инструкции с точностью до символа: ошибка 52. Либо у людей винда 32-битная, либо TESTSIGNING включен. Либо боты-накрутчики.
кто встретился с проблемой установки SDK, удалите MS Visual C ++ 2010 года, как и 32 так и 64 битную версии
Руслан, расскажите, как получилось (если ещё в памяти свежо). У меня драйвер отлично установился по этим рекомендациям, но с AVR910 ошибка 43 (недопустимый дескриптор usb конфигурации. Windows10.
Здравствуйте.
Сделал всё по инструкции, в свойствах драйвера числится, что он подписан. Сертификаты установил в указанное инструкцией место.
Но при попытке установить драйвер, система отображает предупреждение о том, что не может проверить цифровую подпись данного драйвера. В итоге ошибка 52.
Ребята никто не поможет подписать драйвер для телефона FLY IQ436? Самому повторить вышеописанную процедуру слишком сложно! Помогите пожайлуста в СКАЙПЕ Я PatronDragon.
Дохожу до пункта На основе inf файла сгенерируем для нашей платформы cat файл (содержит информацию о всех файлах пакета драйвера). и не знаю какой файл у себя выбрать!? Какой не беру всё равно пишет does not exist! ЧТО ДЕЛАТЬ?
У меня в папке с моим драйвером нет файла inf! Что делать?
Без inf файла у вас ничего не получится, т.к. в именно в нем описывается порядок установки и структура исполняемых файлов драйвера. Посмотрите, возможно он у вас в каком-нибудь архиве лежит (rar, zip, cab)
Хм, зачем тогда авторы пишут такие статьи?
С помощью такой подписи от GoDaddy получится сделать .cat из .inf и .sys ?
Ты не мог бы мне помочь подписать драйвер ?
у тебя ещё год не прошёл вроде
очень нужно
Я написал свой WDF драйвер и подписал его с помощью этого мануала, за что огромное спасибо написавшему! Написал инсталлятор на wix и дрова прекрасно ставятся на x64 Винду 10.0 без включения тестмода и проверки подписей, даже предупреждение не отображается. С другой стороны 8000 это не деньги, конечно, для фирмы средней руки
Всё, похоже GoDaddy прикрыли лавочку продажи сертификатов подписи кода и драйверов. Вот что на сайте у них:
С 1 июня 2021 года GoDaddy больше не будет выдавать и продлевать сертификаты подписи кода и драйверов. Если у вас уже есть сертификат подписи кода или драйвера, вы не сможете повторно создать его ключ после 1 июня 2021 года. Все сертификаты, выданные до 1 июня 2021 года, будут действительны до истечения их срока действия
С помощью такой подписи от GoDaddy получится сделать .cat из .inf и .sys ?
В результате подписывания исходные .inf и .sys как-то модифицируются или никак не затрагиваются?
Их исходники не нужны для подписывания драйвера?
Если я куплю такого типа сертификат, то получится ли с его помощью заменить подпись в некоем драйвере на свою?
Например, есть подписанный драйвер ( состоит из .inf, .sys , .cat файлов ).
Получится ли убрать от него .cat и создать новый .cat ( командами inf2cat.exe и signtool.exe ), подписанный таким сертификатом?
Такой драйвер будет нормально работать?
Другими словами , работает ли такое, что можно убрать одну цифровую подпись и вместо неё поставить другую?
Сергей, Вы получили сертификат с алгоритмом хеширования подписи SHA1, SHA2 или с SHA256?
Надо ли на винду ставить какие-то апдейты или пэтчи, чтобы подписанные драйверы не выдавали ошибку 52?
SHA1 и SHA2. Подписал с использованием SHA2, чтобы и Win10 охватить. По идее, Win7 должна понимать SHA2 только после патча, в реальности же на Win7 x64 драйвер встаёт (что без подписи невозможно), но Винда говорит, что подписи нет 🙂
Сергей, я могу обратить к Вам за помощью. Вы бы не смогли подписать всего один драйвер. Я бы Вам мог их скинуть на почту. Если сможете помочь прошу отзовитесь. Был бы Вам очень признателен!
А на 32 битной Windows 7 можно как-то подписать драйвер?
Сам отвечу, можно, на процессе создание cat файла нужно записать не x64, a x86. Спасибо, инструкция рабочая
Я так и сделал, правда сначала получил какую-то ошибку, исправил, и второй раз все получилось.
Спасибо за отзыв! Поправил путь
Сделал все как описано. Подписал драйвер старого оборудования для сетевой карты. Все работает на сервер 2012 r2 без тестового режима.
Отличная статья, получилось сделать на Windows server 2012.
Проблемы возникли такие:
22.9.4: Missing 32-bit CatalogFile entry (CatalogFile.ntx86, CatalogFile.nt, CatalogFile) from [Version] section in \skeyusb.inf
но все решил добавлением в файл inf строчки CatalogFile(или разкоментированием).
даже установка сертификата на сервер не нужна была. Спасибо огромное. Как вы это придумываете))
Решил разобраться в технологии сертификации. Второй день читаю горы материала в интернете и нигде нет простого и четкого объяснения, как Windows работает с цифровыми подписями и сертификатами. Что с чем сравнивается и когда? Везде куски специальной информации или бесконечные переписывания одних и тех же вещей. Ощущение, что никто до конца не понимает этой темы.
потому что это секрет Майков
Done Adding Additional Store
SignTool Error: The specified timestamp server either could not be reached or
returned an invalid response.
SignTool Error: An error occurred while attempting to sign: C:\DriverCert\xg\gn246hl.cat
может кто встречался с такой проблемой?
пишет что сервер временной метки дает неправильный ответ
Читайте также: