Поделиться через


Подписывание для разработчиков игр с использованием "Authenticode"

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

Примечание.

По состоянию на 1 января 2016 г. Windows 7 и более поздних версий не доверяет любому сертификату подписи кода SHA-1 с датой окончания срока действия 1 января 2016 г. или более поздней версии. Для получения более подробной информации см. статью о контроле Windows за подписями кода и метками времени Authenticode.

Общие сведения

Цифровые сертификаты используются для установления удостоверения автора. Цифровые сертификаты выдаются доверенным сторонним поставщиком, известным как центр сертификации (ЦС), например VeriSign или Thawte. УЦ отвечает за проверку того, что владелец не выдаёт себя за другое лицо. После подачи заявки в УЦ на получение сертификата коммерческие разработчики могут ожидать ответа в течение двух недель.

После того как удостоверяющий центр примет решение, что вы соответствуете критериям его политики, он создает сертификат подписи кода, соответствующий формату X.509, стандарту отрасли, созданному Международным телекоммуникационным союзом, с расширениями версии 3. Этот сертификат идентифицирует вас и содержит открытый ключ. Он хранится ЦС для справки, и копия предоставляется вам в электронном виде. В то же время вы также создаете частный ключ, который необходимо держать в безопасности и которым не следует делиться ни с кем, даже с удостоверяющим центром.

После того как у вас есть открытый и закрытый ключ, вы можете начать распространение подписанного программного обеспечения. Корпорация Майкрософт предоставляет средства для этого в пакете SDK для Windows. Средства используют одностороннюю хэш-функцию, создают дайджест фиксированной длины и создают зашифрованную подпись с закрытым ключом. Затем они объединяют зашифрованную подпись с сертификатом и учетными данными в структуру, известную как блок подписи, и внедряют ее в формат файла исполняемого файла. Любой тип исполняемого двоичного файла можно подписать, включая библиотеки DLL, программы и кабинетные файлы.

Подпись может быть проверена несколькими способами. Программы могут вызывать функцию CertVerifyCertificateChainPolicy и SignTool (signtool.exe) можно использовать для проверки подписи из командной строки. В проводнике Windows также есть вкладка "Цифровые подписи" в свойствах файлов, в которых отображается каждый сертификат подписанного двоичного файла. (Вкладка "Цифровые подписи" отображается только в свойствах файла для подписанных файлов.) Кроме того, приложение может самостоятельно проверяться с помощью CertVerifyCertificateChainPolicy.

Подписывание Authenticode полезно не только для проверки подлинности данных конечными пользователями, но и необходимо для исправления учетных записей с ограниченными правами и родительского контроля в Windows Vista и Windows 7. Кроме того, для будущих технологий в операционных системах Windows также может потребоваться подпись кода, поэтому настоятельно рекомендуется, чтобы все профессиональные и любительские разработчики приобрели сертификат подписи кода из ЦС. Дополнительные сведения о том, как это сделать, можно найти далее в этой статье в разделе "Использование доверенного центра сертификации".

Код игры, исправления и установщики могут дополнительно использовать подписывание Authenticode, проверяя подлинность файлов в коде. Это можно использовать для защиты от обмана и общей сетевой безопасности. Пример кода для проверки подписанности файла можно найти здесь: Пример программы C: проверка подписи PE-файла, а также пример кода для проверки информации о сертификате подписи в подписанном файле доступен здесь: Как получить информацию из исполняемых файлов, подписанных Authenticode.

Начало работы

Чтобы приступить к работе, корпорация Майкрософт предоставляет средства с Visual Studio 2005 и Visual Studio 2008, а также в пакете SDK для Windows, чтобы помочь выполнить и проверить процесс подписывания кода. После установки Visual Studio или пакета SDK для Windows средства, описанные в этой технической статье, находятся в подкаталоге установки, которая может включать одно или несколько следующих элементов:

  • %SystemDrive%\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin
  • %SystemDrive%\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Bin
  • %SystemDrive%\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\SDKTools\
  • %SystemDrive%\Program Files\Microsoft SDK\Windows\v6.0A\bin\

Следующие средства наиболее полезны для подписывания кода:

Средство создания сертификатов (MakeCert.exe)

Создает тестовый сертификат X.509 в виде файла .cer, который содержит открытый ключ и закрытый ключ в виде PVK-файла. Этот сертификат предназначен только для внутренних целей тестирования и не может использоваться публично.

pvk2pfx.exe

Создает файл Обмена персональными данными (PFX) из пары .cer и PVK-файлов. PFX-файл содержит открытый и закрытый ключ.

SignTool (SignTool.exe)

Подписывает файл с помощью PFX-файла. SignTool поддерживает подписывание DLL, исполняемых файлов, файлов установщика Windows (.msi) и архивов (.cab).

Примечание.

При чтении другой документации вы можете найти ссылки на SignCode (SignCode.exe), но это средство устарело и больше не поддерживается — используйте SignTool.

 

Использование доверенного центра сертификации

Чтобы получить доверенный сертификат, необходимо обратиться в Центр сертификации, например VeriSign или Thawte. Корпорация Майкрософт не рекомендует какого-либо конкретного удостоверяющего центра (ЦС) перед другими, но если вы хотите интегрироваться в службу отчётов об ошибках Windows (WER), рекомендуется использовать VeriSign для выдачи сертификата, так как для доступа к базе данных WER требуется учётная запись WinQual, для которой необходим сертификат VeriSign. Полный список доверенных сторонних центров сертификации см. в разделе "Участники программы корневых сертификатов Майкрософт". Для получения дополнительной информации о регистрации в WER см. раздел "Введение в Windows Error Reporting" в Зоне ISV.

После получения сертификата из ЦС вы можете подписать программу с помощью SignTool и освободить программу для общественности. Однако необходимо тщательно защитить закрытый ключ, который содержится в PFX-файлах и PVK-файлах. Не забудьте сохранить эти файлы в безопасном расположении.

Пример использования тестового сертификата

В следующих шагах показано создание сертификата подписи кода для тестирования, а затем подписывание примера программы Direct3D (называемой BasicHLSL.exe) с помощью этого тестового сертификата. Эта процедура создает .cer и PVK-файлы — открытые и закрытые ключи соответственно, которые нельзя использовать для общедоступной сертификации.

В этом примере метка времени также добавляется в сигнатуру. Метка времени предотвращает недопустимость подписи при истечении срока действия сертификата. Код, подписанный, но отсутствует метка времени, не проверяется после истечения срока действия сертификата. Таким образом, весь общедоступный код должен иметь метку времени.

Создание сертификата и подпись программы

  1. Создайте тестовый сертификат и закрытый ключ с помощью средства создания сертификатов (MakeCert.exe).

    Следующий пример командной строки указывает MyPrivateKey в качестве имени файла закрытого ключа (PVK), MyPublicKey в качестве имени файла сертификата (.cer) и MySoftwareCompany в качестве имени сертификата. Он также делает сертификат самозаверяющим, чтобы он не зависел от ненадежного корневого удостоверяющего центра.

    MakeCert /n CN=MySoftwareCompany /r /h 0 /eku "1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13" /e 12-31-2020 /sv MyPrivateKey.pvk MyPublicKey.cer
    
  2. Создайте файл обмена персональной информацией (.pfx) из файла вашего закрытого ключа (.pvk) и файла сертификата (.cer) с помощью pvk2pfx.exe.

    PFX-файл объединяет открытые и закрытые ключи в один файл. В следующем примере командной строки используются ФАЙЛЫ PVK и .cer из предыдущего шага, чтобы создать PFX-файл с именем MyPFX с паролем your_password:

    pvk2pfx.exe -pvk MyPrivateKey.pvk -spc MyPublicKey.cer -pfx MyPFX.pfx -po your_password
    
  3. Подпишите вашу программу с помощью файла личного обмена информацией (.pfx) с использованием SignTool.

    Можно указать несколько параметров в командной строке. В следующем примере командной строки используется PFX-файл из предыдущего шага, предоставляет your_password в качестве пароля, указывает BasicHLSL в качестве подписанного файла и извлекает метку времени с указанного сервера:

    signtool.exe sign /fd SHA256 /f MyPFX.pfx /p your_password /v /t URL_to_time_stamp_service BasicHLSL.exe
    

    Примечание.

    URL-адрес службы меток времени предоставляется ЦС и является необязательным для тестирования. Важно, чтобы подпись для выпуска в производство включала действующий удостоверяющий центр временных меток, в противном случае подпись не будет проверена, когда срок действия сертификата истечёт.

     

  4. Убедитесь, что программа подписана с помощью SignTool.

    В следующем примере командной строки указывается, что SignTool должна попытаться проверить подпись в BasicHLSL.exe с помощью всех доступных методов при предоставлении подробных выходных данных:

    signtool.exe verify /a /v BasicHLSL.exe
    

    В этом примере SignTool должен указывать на то, что сертификат присоединен, и одновременно показывать, что он не является доверенным, так как он не выдан центром сертификации.

  5. Доверяйте сертификату тестирования.

    Для тестовых сертификатов необходимо доверять сертификату. Этот шаг должен быть пропущен для сертификатов, предоставляемых ЦС, так как они будут доверенными по умолчанию.

    На тех компьютерах, на которых вы хотите доверять тестовому сертификату, выполните следующее:

    certmgr.msc
    

    Затем щелкните правой кнопкой мыши на "Доверенные корневые центры сертификации" и выберите "Все задачи" | Импорт. Затем перейдите к созданному PFX-файлу и выполните действия мастера, разместив сертификат в доверенных корневых центрах сертификации.

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

Интеграция подписывания кода в систему ежедневной сборки

Чтобы интегрировать подпись кода в проект, можно создать пакетный файл или скрипт для запуска инструментов командной строки. После создания проекта запустите SignTool с соответствующими параметрами (как показано на шаге 3 нашего примера).

Будьте особенно внимательны в процессе сборки, чтобы запретить доступ к файлам .pfx и .pvk как можно большему количеству компьютеров и пользователей. Рекомендуется, чтобы разработчики подписывали код только с помощью тестового сертификата, пока они не будут готовы к отправке. Опять же, закрытый ключ (PVK) должен храниться в защищенном расположении, например в безопасном или заблокированном помещении, и в идеале на криптографических устройствах, таких как смарт-карта.

Другой уровень защиты предоставляется с помощью Microsoft Authenticode для подписывания самого пакета установщика Windows (MSI). Это помогает защитить пакет MSI от незаконного изменения и случайного повреждения. Дополнительные сведения о том, как подписывать пакеты с помощью Authenticode, см. в документации вашего средства создания MSI.

аннулирование

Если безопасность закрытого ключа скомпрометирована или любое событие, связанное с безопасностью, делает сертификат подписи кода недействительным, разработчик должен отозвать сертификат. Не выполнение этого условия ослабило бы целостность разработчика и эффективность подписывания кода. Центр сертификации также может выдавать отзыв сертификата с указанием определенного времени; код, имеющий временную метку до времени отзыва, по-прежнему считается допустимым, но код с более поздней временной меткой будет недопустим. Отзыв сертификата влияет на код в любых приложениях, подписанных с отозванным сертификатом.

Драйверы подписывания кода

Драйверы могут и должны быть подписанными с помощью Authenticode. Драйверы в режиме ядра имеют дополнительные требования: 64-разрядные выпуски Windows Vista и Windows 7 не позволят устанавливать все неподписанные драйверы режима ядра, а все версии Windows будут представлять предупреждение при попытке пользователя установить неподписанный драйвер. Кроме того, администраторы могут задать групповую политику, чтобы предотвратить установку неподписанных драйверов в Microsoft Windows Server 2003, Windows XP Professional x64 Edition и 32-разрядных выпусках Windows Vista и Windows 7.

Многие типы драйверов могут быть подписаны с помощью доверенной подписи Майкрософт ( в рамках программы сертификации Windows для лабораторий качества оборудования Windows (WHQL) или неклассифицированной программы подписи (прежнее название — подпись надежности драйверов), которая позволяет системе полностью доверять этим драйверам и устанавливать их даже без учетных данных администратора.

Как минимум, драйверы должны быть подписаны подписью Authenticode, так как неподписанные или самоподписанные драйверы (то есть подписанные с помощью тестового сертификата) не смогут устанавливаться на многих платформах, работающих под управлением Windows. Дополнительные сведения о подписи драйверов и кода и связанных функциях см. в разделе "Требования к подписи драйверов" для Windows on Windows Hardware Developer Central.

Итоги

Использование Microsoft Authenticode — это простой процесс. Получив CER и создав закрытый ключ, это простой вопрос использования средств, предоставляемых корпорацией Майкрософт. Затем вы можете включить важные функции в Windows Vista и Windows 7, такие как родительский контроль, и сообщить клиентам, что ваш продукт поставляется непосредственно от своего правого владельца.

Дополнительные сведения

Дополнительные сведения о средствах и процессах, связанных с кодом подписывания, см. в следующих ссылках: