Подписание кода - это процесс цифровой подписи исполняемых файлов и скриптов для подтверждения личности
автора программного обеспечения и гарантии того, что код не был изменен или поврежден с момента его подписания.
Публично доверенные сертификационные центры (ЦС) подтверждают удостоверения подписчиков и связывают
их открытый ключ с сертификатом подписи кода.
Зачем нужен сертификат кода подписи?
Большинство продаваемых сегодня вычислительных устройств массового рынка поставляются с предварительно
загруженным программным обеспечением, но программное обеспечение, поставляемое с устройством «из коробки»,
стареет и часто требует обновления. Для персонального компьютера или мобильного устройства пользователи
часто сталкиваются с ситуациями, когда им необходимо загрузить обновленное программное обеспечение или
приложение, ногда обновление происходит в автоматическом режиме.
Пользователям рекомендуется использовать приложение на своем устройстве или посещаемом им сайте,
чтобы, чтобы испытать или использовать предлагаемое им, им необходимо обновить, исправить или расширить
свое текущее программное обеспечение. Их просят принять правильное решение: «Запустить» или «Не запускать».>
В этой ситуации операционная система спрашивает Разрешить или Неразрешить «run / do not run» у пользователя,
следует ли запускать загруженный код. Как решит пользователь? Как пользователь или пользовательский агент
например «браузер» знает, доверять ли вам программному обеспечению или нет?
Ответ - это наличие подписи кода. Чтобы помочь пользователю принять решение, издатель программного обеспечения
может в цифровой форме подписать свой код. Цифровая подпись отвечает на вопросы аутентификации и целостности кода, то есть:
Кто подписал код?
Был ли изменен код с момента его подписания?
Вооружившись этой информацией, пользователь теперь может принять решение «запустить / не запускать» код.
Несмотря на то, что цифровая подпись не отвечает, можете ли вы «доверять» программному обеспечению,
чтобы не нанести вред вашему компьютеру, неподписанный код не предоставляет никаких доказательств происхождения
или целостности файла. Издатель не идентифицирован и, следовательно, не может быть привлечен к ответственности.
Кроме того, код может быть подделан. Код с цифровой подписью, который поддерживается сертификатом, выданным ЦС,
действующим в качестве доверенной третьей стороны, получает большую надежность, чем неподписанный код,
который, как правило, не должен быть доверенным
Code Signing процедура подписи кода
«Подписание кода - это процесс цифровой подписи исполняемых файлов и сценариев для подтверждения автора
программного обеспечения и гарантии того, что код не был изменен или поврежден, поскольку он был подписан с
использованием криптографического хэша.
Чтобы подписать код, издателю необходимо иметь пару: открытый и закрыты ключь.
В Центр сертификации отправляется запрос на выдачу сертификата подписи кода.
CA проверяет подлинность издателя и подтверждает подлинность сертификата, подписанного цифровым подписчиком.
Если этот процесс проверки и проверки ключа успешный, ЦС связывает личность издателя с открытым ключом и подписывает пакет,
создавая сертификат подписи кода.
Вооруженный сертификатом подписи кода, издатель готов подписать код. Когда код подписан, к исходному файлу,
содержащему исполняемый код, добавляется несколько фрагментов информации.
Эта связанная информация используется пользовательским агентом получателя для аутентификации издателя и проверки
на фальсификацию кода. Вся последовательность для объединения кода с цифровой подписью выполняется следующим образом:
Вычисляется хеш кода
Алгоритмы с открытым ключом неэффективны для подписи больших объектов, поэтому код передается через алгоритм хеширования,
создавая дайджест фиксированной длины файла
Хэш представляет собой криптографически уникальное представление файла
Хэш воспроизводится только с использованием неизмененного файла и алгоритма хэширования, который использовался для создания хэша
Хэш подписывается с использованием закрытого ключа издателя
Хэш передается посредством алгоритма подписи с использованием закрытого ключа издателя в качестве входного
Информация об издателе и ЦС берется из сертификата подписи кода и включается в подпись
Оригинальный код, подпись и сертификат подписываются вместе
Ссертификат для подписи кода добавляется в пакет, поскольку открытый ключ требуется для аутентификации кода при его проверке
Проверка подлинности кода
Когда пользователь загружает код, операционная система проверяет подлинность программного обеспечения,
используя открытый ключ подписчика, подпись и хэш файла.
Если подпись подтверждена успешно, пользовательский агент принимает код как неопасный.
Если подпись не была успешно проверена, пользовательский агент будет реагировать, предупреждая пользователя или отклоняя код
в соответствии с уровнем безопасности, который используется.
Подпись проверяется следующим образом:
Исходный код передается через алгоритм хеширования для создания хэша
Открытый ключ издателя извлекается из пакета и применяется к сигнатурной информации; применение открытого ключа показывает хэш, который был рассчитан при подписании файла
Сравнение двух хэшей; если он равен, то код не изменился и подпись считается действительной
Сертификат подписи кода проверяется, чтобы убедиться, что он был подписан доверенным центром сертификации
Дата истечения срока действия сертификата подписи кода проверяется
Сертификат подписи кода проверяется в списках аннулирования, чтобы убедиться, что он действителен
Если файл считается действительным, он принимается агентом пользователя; если файл не считается действительным, пользовательский агент отображает диалог доверия, аналогичный приведенному выше
Как подписать код сертификатом
Различные платформы и приложения поддерживают подписание кода и предоставляют различные инструменты для выполнения подписания.
Ниже приведен список наиболее распространенных типов подписи кода и ссылок на то, где вы можете найти руководства для данного приложения.
Adobe AIR – Digitally signing an AIR file
Firefox XPI – Signing an XPI
Java – How to Sign Applets Using RSA-Signed Certificates и Signing Code and Granting it Permissions
Microsoft Authenticode – Signing and Checking Code with Authenticode
Microsoft Windows Macro and Visual Basic Signing – Signing a VBA Project
Принятие решения пользователем о запуске исполняемого файла
Вот типичное предупреждение безопасности проверки кода.
Код был подписан, пользователь начал установку и проверку. Как пользователю определиться, принимать или не принимать код?
Пользователь должен принять свое доверительное решение на основании вышеизложенного. В заявлении содержится следующее:
Название файла: AdbeRdr1010_en_US.exe
Издатель, автор файла: Adobe Systems, Incorporated
Code Signing сертификат: нажмите на ссылку с именем издателя
Как принять решение о запуске файла:
Планируете ли вы установить программное обеспечение? Если да, переходите к следующему шагу.
Проверьте имя файла и посмотрите, указывает ли оно на программное обеспечение, которое вы планировали установить. В этом случае это Adobe Reader 10, на которое указывает это имя.
Проверьте имя издателя и посмотрите, соответствует ли это тому, кто, по вашему мнению, написал программное обеспечение. Это может быть сложно, поскольку сайт загрузки программного обеспечения может отличаться от сайта издателя.
Проверьте сертификат подписи кода и посмотрите, указано ли имя издателя в сертификате. Кроме того, пользователь может доверять сертификату на основе выдающего ЦС.
Так выгляди диалог с пользователем когда он запускает неподписанный цифровой подписью код
Название файла: App.exe
Издатель, автор файла: Unknown Publisher
«Неизвестный издатель», означает, что публичный ЦС не проверял сертификат подписи кода.
Код может быть вредным, но, скорее всего, он подписан с самовыраженным сертификатом подписи кода или не подписан.
Это означает, что вы не можете доверять, кто подписал код.
Таким образом, вы не должны доверять коду.
Что такое Метка времени Time-Stamping?
Что происходит с подписанным кодом, когда срок действия сертификата подписи кода истек?
Во многих случаях сертификат с истекшим сроком действия означает, что проверка подписи не будет выполнена,
и в пользовательском агенте появится предупреждение о недоверии.
Сервис Штамп времни был разработан для решения этой проблемы.
Идея состоит в том, что, если вы знаете время, когда код был подписан код, и в это время сертификат был подтвержден
как действительный, то вы знаете, что подпись была действительной на момент публикации программного обеспечения.
Это почти то же самое, что и нотариально заверенная подпись, в которой третье лицо может прикрепить доказательства
времени подписания документа.
Основным преимуществом штамповки времени является то, что он расширяет доверие кодов после периода
действия сертификата. Код остается хорошим, когда вы его запускаете.
Кроме того, сертификат может быть отозван или истекает в будущем, но код по-прежнему будет доверенным.
Фиксация времени подписи выполняется следующим образом:
Подпись отправляется в орган фиксации времени time-stamping authority - TSA.
TSA добавляет отметку времени к связанной информации и вычисляет новый хеш.
TSA подписывает новый хэш с его закрытым ключом, создавая новый набор информации.
Пакет с меткой времени, исходный пакет (который был отправлен в TSA) и метка времени повторно связаны
с исходным кодом.
Ппри запуске подписанного кода с отметкой времени выполняется дополнительная проверка штампа в дополнение к проверке подписи самого кода:
Сертификат с TSA проверяется, чтобы убедиться, что он был выпущен из доверенного корневого сертификата и что его статус действителен
Открытый ключ полномочий тайм-аута применяется к блоку подписи с отметкой времени, отображающему хэш, вычисленный TSA.
Действительность открытого ключа TSA проверяется путем проверки его даты истечения срока действия и сравнение со
списком аннулирования сертификата, чтобы быть уверенным, что он не был отозван.
Сравнение двух хэшей. Если хеши равны, отметка времени считается действительной.
В случае, если сертификат подписи кода должен быть отменен из-за компромисса, аннулирование будет зависеть от конкретной даты.
Идея заключается в том, что подписание кода, вплоть до компромисса, было хорошим
т. е. широко распространенным и все еще в хорошем рабочем состоянии.
Другими словами, подписи кода с отметками времени до даты отзыва остаются в силе и программное обеспечение должно работать.
Самоподписанные и выпущенные центрами сертификации сертификаты для подписи кода
В большинстве случаев вам нужно подписать свой код, чтобы установить его в операционной системе.
Вы можете подписать свой код с помощью самозаверяющего сертификата или с помощью сертификата, выданного доверенным центром сертификации.
Из-за затрат на покупку сертификата подписи кода из централизованно доверенного ЦС некоторые пользователи могут
решить попробовать самозаверяющий сертификат, но вот что вам нужно учитывать.
Самоподписаный сертификат
Сертификат выпущенный центром сертификации
Эмитент предоставляет свою личность, которая не публикуется в доверительном диалоге
CA выполняет проверку подлинности, которая отображается в диалоге доверия
Эмитент предоставляет свою собственную политику и качество
CA выдает сертификаты в соответствии с отраслевой политикой и качеством
Подписи будут предоставлять предупреждение о доверии, указывающее, что был неизвестный издатель, и отобразит «Неизвестный издатель»
Подписи обеспечат положительный диалог доверия
Скомпрометированные сертификаты не могут быть отменены и могут нанести вред пользователям вашего программного обеспечения
Скомпрометированные сертификаты могут быть отменены, и если используется штамп времени, код, подписанный до отзыва, останется надежным
Для доверия пользователей и долговечности вашего кода рекомендуется использовать сертификат, выпущенный из центра сертификации, которому доверяют.