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


Метки времени для подписей Authenticode

Подписи Microsoft Authenticode предоставляют гарантии авторства и целостности двоичных данных. Метка времени Authenticode основана на стандартных счетчиках PKCS #7. Средства подписывания из Корпорации Майкрософт позволяют разработчикам аффиксировать метки времени одновременно, так как они прикрепляют подписи Authenticode. Метка времени позволяет проверять подписи Authenticode даже после истечения срока действия сертификатов, используемых для подписи.

Краткое введение в Authenticode

Authenticode применяет технологию цифровой подписи, чтобы гарантировать авторство и целостность двоичных данных, таких как устанавливаемое программное обеспечение. Клиентский веб-браузер или другие системные компоненты могут использовать подписи Authenticode для проверки целостности данных при загрузке или установке программного обеспечения. Подписи Authenticode можно использовать со многими форматами программного обеспечения, включая .cab, .exe, ocx и .dll.

Корпорация Майкрософт поддерживает список общедоступных центров сертификации (ЦС). В настоящее время издатели сертификатов Authenticode включают SSL.com, Digicert, Sectigo(Comodo) и GlobalSign.

Сведения о метке времени шифрования

В прошлом были предложены различные методы шифрования меток времени. См., например, Haber и Stornetta "How to Time-Stamp a Digital Document" in the Journal of Cryptology (1991) и Benaloh and de Mare "One-Way Accumulators: A Децентрализованная альтернатива цифровым подписям" в Springer-Verlag лекции Notes in Computer Science vol. 765 (EUROCRYPT '93). Расширенная абстрактная часть этой статьи доступна в Microsoft Research. (Эти ресурсы могут быть недоступны на некоторых языках и странах или регионах.) Так как время является физическим, а не математическим, количеством, эти методы обычно касаются связывания объектов, чтобы их порядок создания можно было определить или как эффективно группировать объекты, которые можно описать как созданные одновременно.

Системам, которые предназначены для проверки подлинности в качестве количества, всегда требуются некоторые формы доверия. В строго состязательном параметре сложные протоколы можно использовать для обеспечения некоторой степени синхронности. Однако эти протоколы требуют широкого взаимодействия между затронутыми сторонами. На практике, если одному требуется только сертификация времени из доверенного источника, источник может просто выступать в качестве нотария, предоставив подписанный оператор (сертификацию), который объект был представлен для подписи в указанное время.

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

Подписанные документы и счетчики PKCS #7

PKCS #7 — это стандартный формат для криптографических данных, включая подписанные данные, сертификаты и списки отзыва сертификатов (CRL). Конкретный тип PKCS #7, интересующий контекст метки времени, подписывает данные, соответствующие определенному типу контента SignedData PKCS #7.

Пакет PKCS #7 состоит из SignData , который определяет фактическое содержимое и определенные сведения об этом и блоки подписи SignerInfo. SignerInfo может содержать контрназначение, которое рекурсивно является другим SignerInfo. В принципе, может присутствовать последовательность таких контрназначений. Счетчик является атрибутом без проверки подлинности относительно сигнатуры в SignerInfo; то есть он может быть прикреплен к исходной сигнатуре. В форме структуры:

SignedData (PKCS #7)

  • Версия (PKCS #7, как правило, версия 1)
  • DigestAlgorithms (коллекция всех алгоритмов, используемых блоками подписей SignerInfo, для оптимизированной обработки)
  • ContentInfo (contentType равно SignedData, плюс содержимое или ссылка на содержимое)
  • НЕОБЯЗАТЕЛЬНЫЕ сертификаты (коллекция всех используемых сертификатов)
  • Необязательные списки отзыва сертификатов (коллекция всех списков ОТЗЫВА)
  • Блоки подписи SignerInfo (фактическая подпись, состоящая из одного или нескольких блоков подписи SignerInfo)

SignerInfo (блок подписи)

  • Версия (PKCS #7, как правило, версия 1)
  • Сертификат (издатель и серийный номер для уникального определения сертификата подписи в SignData)
  • DigestAlgorithm плюс DigestEncryptionAlgorithm плюс Хэш (хэш), а также EncryptedDigest (фактическая подпись)
  • OPTIONAL AuthenticatedAttributes (например, подписанный этим подписчиком)
  • НЕОБЯЗАтельный параметр UnauthenticatedAttributes (например, не подписанный этим подписчиком)

Примером атрибута проверки подлинности является время подписывания (OID 1.2.840.113549.1.9.5), так как оно является частью того, что служба меток времени подписывает. Пример атрибута без проверки подлинности — это счетчик (OID 1.2.840.113549.1.9.6), так как его можно прикрепить после подписания. В этом случае signerInfo сам содержит SignerInfo (countersignature).

Примечание.

Объект, подписанный в счетчике, является исходной подписью (т. е. EncryptedDigest исходного SignerInfo).

 

SignTool и процесс Authenticode

SignTool доступен для подписывания Authenticode и метки времени двоичных данных. Средство устанавливается в папку \Bin пути установки пакета SDK для Microsoft Windows.

Подписывание и метка времени двоичных данных относительно просто с помощью SignTool. Издатель должен получить сертификат подписи кода из ЦС подписывания коммерческого кода. Для удобства корпорация Майкрософт публикует и обновляет список общедоступных ЦС, включая те, которые выдают сертификаты Authenticode. После готовности к публикации файлы объектов подписываются и метки времени с помощью соответствующих параметров командной строки с помощью средства SignTool. Результатом любой операции SignTool всегда является формат PKCS #7 SignedData.

SignTool принимает в качестве входных необработанных двоичных данных подписанные и метки времени или ранее подписанные двоичные данные для метки времени. Данные, подписанные ранее, могут быть метками времени с помощью команды метки времени подписи.

Аргумент Description
/t HTTPAddress Указывает, что файл должен быть меткой времени. URL-адрес, указывающий адрес сервера метки времени, должен быть предоставлен. /t можно использовать как с командами signtool, так и со метками времени подписи.

 

Дополнительные сведения о средствах, которые могут быть полезны в этом контексте, см. в разделе "Средства шифрования" и "SignTool".

Сведения о реализации и формат провода

SignTool использует реализацию Windows Authenticode для создания и подписей меток времени. Authenticode работает с двоичными файлами, например .cab, .exe, .dll или .ocx. Authenticode сначала создает подпись, создавая PKCS #7 SignedData. Это подписанные данные, которые должны быть подписаны, как описано в PKCS #9.

Процесс счетчика выполняется в четырех шагах:

  1. Скопируйте подпись (то есть зашифрованныйDigest) из SignerInfo PKCS #7 SignedData.
  2. Создайте запрос метки времени, содержимое которого является исходной подписью. Отправьте его на сервер абстрактной нотации синтаксиса метки времени (ASN.1), закодированный как TimeStampRequest.
  3. Получает метку времени, отформатированную как вторую PKCS #7 SignedData, возвращенную с сервера меток времени.
  4. Скопируйте SignerInfo из метки времени непосредственно в исходный PKCS #7 SignedData в виде счетчика PKCS #9 (то есть атрибута без проверки подлинности в SignerInfo исходного).

Запрос метки времени

Запрос метки времени отправляется в сообщении HTTP 1.1 POST. В заголовке HTTP директива CacheControl имеет значение no-cache, а директива Content-Type имеет значение application/octet-stream. Текст HTTP-сообщения — это кодировка base64 кодирования различающихся правил кодирования (DER) запроса метки времени.

Хотя в настоящее время не используется, директива Content-Length также должна использоваться при создании HTTP-сообщения, так как он помогает серверу меток времени находить место, где запрос находится в HTTP POST.

Другие заголовки HTTP также могут присутствовать и должны игнорироваться, если они не понимаются запросителем или сервером меток времени.

Запрос метки времени — это закодированное сообщение ASN.1. Формат запроса выглядит следующим образом.

TimeStampRequest ::= SEQUENCE {
   countersignatureType OBJECT IDENTIFIER,
   attributes Attributes OPTIONAL, 
   content  ContentInfo
}

CountersignatureType — это идентификатор объекта (OID), который определяет это как счетчик меток времени и должен быть точным идентификатором OID 1.3.6.1.4.1.311.3.2.1.

В настоящее время атрибуты не включаются в запрос метки времени.

Содержимое — это ContentInfo, определенное PKCS #7. Содержимое — это подписанные данные. Для метки времени подписи contentType должно быть Data, и содержимое должно быть зашифрованнымDigest (подпись) из SignerInfo содержимого PKCS #7, чтобы быть меткой времени.

Ответ метки времени

Ответ метки времени также отправляется в сообщении HTTP 1.1. В заголовке HTTP директива Content-Type также имеет значение application/octet-stream. Текст HTTP-сообщения — это кодировка DER для ответа метки времени в кодировке base64.

Ответ метки времени — это подписанное сообщение PKCS #7, подписанное меткой времени. ContentInfo сообщения PKCS #7 идентичен содержимому ContentInfo, полученному в метке времени. Содержимое PKCS #7 содержит атрибут проверки подлинности во время подписи (определенный в PKCS #99, OID 1.2.840.113549.9.5).

После того как Authenticode получает метку времени от сервера, Authenticode включает метку времени в исходный PKCS #7 SignedData в качестве счетчика. Для этого функция ContentInfo возвращаемого PKCS #7 SignData удаляется, а метка времени SignerInfo возвращаемого метки времени копируется в signerInfo исходного PKCS #7 SignerData. Цепочка сертификатов метки времени также копируется в сертификаты в исходном PKCS #7 SignData в качестве неавтодентированного атрибута исходного подписывающего элемента.