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


Проверка цепочки сертификатов

[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио и видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать при разработке нового программного обеспечения MediaPlayer, IMFMediaEngine и средства захвата аудио и видео в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]

В этом разделе описывается, как проверить цепочку сертификатов драйвера при использовании протокола сертифицированной защиты выходных данных (COPP).

Цепочка сертификатов драйвера рисунка — это XML-документ. Цепочка сертификатов содержит три сертификата. Первый сертификат называется листовым сертификатоми является сертификатом COPP драйвера. Следующий сертификат — сертификат подписи независимого поставщика оборудования (IHV). Последний сертификат — сертификат подписи Майкрософт. Чтобы убедиться, что графический драйвер является законным устройством COPP, приложение должно проверить все три этих сертификата. Вредоносные программы могут предотвратить работу COPP, если приложение не правильно проверяет сертификаты в цепочке.

Цепочки сертификатов COPP используют набор символов UTF-8. Двоичные данные в сертификатах, таких как открытый ключ RSA, кодируются в кодировке Base64 и хранятся в порядке старшего байта вперёд. (Big-endian означает, что самый значительный байт хранится в ячейке памяти с наименьшим адресом.)

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

Определения ЭЛЕМЕНТОВ XML

Ниже приведены определения элементов в схеме сертификата:

  • CertificateCollection. Корневой элемент XML-документа. Он содержит элементы сертификата, по одному для каждого сертификата в цепочке.
  • сертификат. Содержит один сертификат. Этот элемент содержит элементы Данные и Подпись.
  • данных. Содержит сведения о сертификате. В частности, он содержит открытый ключ сертификата и тип. Элемент Data содержит следующие дочерние элементы:
    • ОткрытыйКлюч. Содержит открытый ключ RSA сертификата. Элемент PublicKey содержит элемент KeyValue, содержащий элемент RSAKeyValue. Элемент RSAKeyValue имеет два дочерних элемента, Modulus и Exponent, и они определяют открытый ключ. Элементы Modulus и Экспоненты кодируются в Base64 и хранятся в порядке старшего байта.
    • KeyUsage. Если сертификат является сертификатом COPP драйвера, этот элемент должен содержать дочерний элемент с именем EncryptKey. Если сертификат является сертификатом подписи IHV или сертификатом подписи Майкрософт, он должен содержать дочерний элемент с именем SignCertificate. Оба дочерних элемента содержат булевы значения.
    • SecurityLevel. Этот элемент следует игнорировать.
    • ManufacturerData. Указывает изготовителя и модель графического устройства. Этот элемент является информационным только.
    • функции. Содержит элементы, которые указывают использование сертификата. Единственным, что относится к COPP, является элемент COPPCertificate. Другие дочерние элементы могут присутствовать, если это так, их следует игнорировать. Если элемент COPPCertificate существует, сертификат является сертификатом COPP. Этот элемент должен присутствовать в листовом узле допустимого сертификата COPP. Этот элемент содержит логическое значение.
  • сигнатуры. Содержит подпись для этого сертификата. Он содержит следующие дочерние элементы:
    • SignedInfo. Содержит сведения о подписи. Важным дочерним элементом этого элемента является элемент DigestValue, содержащий значение хэша SHA-1 в кодировке Base64 по элементу Data. Значение дайджеста используется при проверке сертификата в списке отзыва сертификатов (CRL).
    • SignatureValue. Это значение вычисляется по элементу Data и вычисляется в соответствии со схемой цифровых подписей RSASSA-PSS, определенной в Public-Key стандартах шифрования (PKCS) #1 (версия 2.1). Дополнительные сведения о PKCS #1 см. в https://www.rsa.com/.
    • KeyInfo. Содержит открытый ключ RSA следующего сертификата в цепочке. Этот элемент используется для проверки того, что данные в элементе Data не были изменены. Этот элемент имеет тот же формат, что и элемент PublicKey.

Проверка сертификата

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

Проверка процедуры сбора сертификатов

Чтобы проверить цепочку сертификатов, выполните следующие действия.

  1. Убедитесь, что коллекция сертификатов является хорошо сформированным XML.
  2. Убедитесь, что коллекция сертификатов закодирована в формате UTF-8.
  3. Убедитесь, что атрибут Version в элементе CertificateCollection равен 2.0 или более поздней версии.
  4. Убедитесь, что цепочка сертификатов содержит ровно три элемента сертификата.
  5. Прокрутите каждый элемент Certificate в цепочке сертификатов и выполните процедуру проверки сертификата, описанную ниже.

Процедура утверждения сертификата

Чтобы проверить сертификат в цепочке, выполните следующие действия.

  1. Убедитесь, что ни один из дочерних элементов в элементе Data не дублируется. Например, должен быть только один элемент PublicKey.
  2. Убедитесь, что элемент Data/PublicKey/KeyValue/RSAKeyValue/Modulus существует. Декодированное значение base64 должно составлять 256 байт для всех сертификатов, кроме корневого. В корневом сертификате этот элемент должен иметь длину 128 байт.
  3. Убедитесь, что элемент Data/PublicKey/KeyValue/RSAKeyValue/Exponent существует. Декодированные значения base64 не должны превышать 4 байта.
  4. Если этот сертификат является конечным сертификатом, проверьте следующее:
    • Элемент KeyUsage содержит элемент EncryptKey со значением 1.
    • Элемент Features содержит элемент COPPCertificate со значением 1.
  5. Если этот сертификат не является конечным сертификатом, проверьте следующее:
    • Модуль и экспонент из элемента Data/PublicKey точно соответствует модулу и экспоненту элемента Signature/KeyInfo предыдущего сертификата.
    • Элемент KeyUsage содержит элемент SignCertificate со значением 1.
  6. Используйте алгоритм хэша SHA-1 для хэширования каждого байта в элементе Data сертификата. Каждый байт от первого символа в теге <Data> до последнего символа в закрывающей </Data> тег должен быть хэширован. Хэш-значение используется для проверки сертификата по спискам отзыва сертификатов (CRL), как описано в списках отзыва сертификатов
  7. Сравните хэш-значение из шага 6 с значением, декодированным из base64 элемента Signature/SignedInfo/Reference/DigestValue. Эти значения должны соответствовать.
  8. Выполните процедуру проверки подписи, описанную ниже.
  9. Если этот сертификат не является окончательным сертификатом в цепочке, сохраните значение Signature/KeyInfo/KeyValue/RSAKeyValue для следующей итерации цикла.
  10. Если этот сертификат является окончательным сертификатом в цепочке, убедитесь, что значение signature/KeyInfo/KeyValue/RSAKeyValue соответствует открытому ключу Майкрософт. Открытый ключ Майкрософт имеет следующие значения в кодировке Base64:
    • Модуль:

      pjoeWLSTLDonQG8She6QhkYbYott9fPZ8tHdB128ZETcghn5KHoyin7HkJEcPJ0Eg4UdSv a0KDIYDjA3EXd69R3CN2Wp/QyOo0ZPYWYp3NXpJ700tKPgIplzo5wVd/69g7j+j8M66W7V NmDwaNs9mDc1p2+VVMsDhOsV/Au6E+E=

    • Экспонент: AQAB

Проверка процедуры подписи

Значение элемента SignatureValue вычисляется по элементу Data в соответствии с схемой цифровой подписи RSASSA-PSS, определенной в PKCS #1 версии 2.1 (далее называется PKCS). Чтобы проверить эту подпись, выполните следующие действия.

  1. Декодирование значений Modulus и Exponent в элементе Signature/KeyInfo/KeyValue/RSAKeyValue. Эти значения определяют открытый ключ RSA сертификата подписи.
  2. Декодируйте элемент Signature/SignatureValue.
  3. Вычислить операцию RSASSA-PSS-Verify, определенную в разделе 8.1.2 PKCS.

Для операции RSASSA-PSS-Verify используйте следующие входные данные:

  • (n,e) является открытым ключом из шага 1.
  • M — это все байты в элементе Data, включая теги <Data> и </Data>, заключающие элемент.
  • S — это декодированные значения подписи из шага 2.

Операция RSASSA-PSS-Verify использует операцию EMSA-PSS-ENCODE, определенную в разделе 9.1.1. PKCS. Для этой операции КОПП использует следующие параметры:

  • Хэш = SHA-1
  • hLen = 20
  • MGF (функция создания маски) = MGF1
  • sLen = 0

Функция создания маски MGF1 определена в приложении B.2 PKCS. Для этой функции КОПП использует следующие параметры:

  • Хэш = SHA-1
  • hLen = 20

Выходные данные операции RSASSA-PSS-Verify указывают, является ли подпись допустимой или недопустимой.

Использование сертифицированного протокола защиты выходных данных (COPP)