Freigeben über


Überprüfen der Zertifikatkette

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

In diesem Thema wird beschrieben, wie Sie die Zertifikatkette des Treibers überprüfen, wenn Sie das Certified Output Protection Protocol (COPP) verwenden.

Die Zertifikatkette des Grafiktreibers ist ein XML-Dokument. Die Zertifikatkette enthält drei Zertifikate. Das erste Zertifikat wird als Blattzertifikat bezeichnet und ist das COPP-Zertifikat des Treibers. Das nächste Zertifikat ist das Signaturzertifikat des unabhängigen Hardwareanbieters (Independent Hardware Vendor, IHV). Das letzte Zertifikat ist das Signaturzertifikat von Microsoft. Um sicherzustellen, dass der Grafiktreiber ein legitimes COPP-Gerät ist, muss die Anwendung alle drei Zertifikate überprüfen. Ein schädliches Programm kann verhindern, dass COPP funktioniert, wenn eine Anwendung die Zertifikate in der Kette nicht ordnungsgemäß überprüft.

COPP-Zertifikatketten verwenden den UTF-8-Zeichensatz. Binärdaten in den Zertifikaten, z. B. der öffentliche RSA-Schlüssel, werden base64-codiert und in big-endian-Reihenfolge gespeichert. (Big-Endian bedeutet, dass das wichtigste Byte im Speicherspeicherort mit der niedrigsten Adresse gespeichert wird.)

Einige Elemente innerhalb eines Zertifikats enthalten boolesche Werte, um anzugeben, dass ein Feature des Zertifikats vorhanden ist. Wenn das Feature vorhanden ist, wird der entsprechende untergeordnete Elementwert auf 1 festgelegt. Wenn kein Feature vorhanden ist, ist dieses untergeordnete Element nicht im Zertifikat vorhanden.

XML-Elementdefinitionen

Im Folgenden sind Definitionen für Elemente im Zertifikatschema aufgeführt:

  • CertificateCollection. Das Stammelement des XML-Dokuments. Es enthält Zertifikatelemente, eines für jedes Zertifikat in der Kette.
  • Zertifikat. Enthält ein Zertifikat. Dieses Element enthält Daten- und Signaturelemente.
  • Daten. Enthält Informationen zum Zertifikat. Insbesondere enthält es den öffentlichen Schlüssel und den Typ des Zertifikats. Das Data-Element enthält die folgenden untergeordneten Elemente:
    • PublicKey. Enthält den öffentlichen RSA-Schlüssel des Zertifikats. Das PublicKey-Element enthält ein KeyValue-Element, das ein RSAKeyValue-Element enthält. Das RSAKeyValue-Element verfügt über zwei untergeordnete Elemente, Modulus und Exponent, und diese definieren den öffentlichen Schlüssel. Die Elemente Modulus und Exponent sind base64-codiert und in big-endian-Reihenfolge gespeichert.
    • KeyUsage. Wenn das Zertifikat das COPP-Zertifikat des Treibers ist, sollte dieses Element ein untergeordnetes Element namens EncryptKey enthalten. Wenn das Zertifikat das Signaturzertifikat des IHV oder das Signaturzertifikat von Microsoft ist, sollte es ein untergeordnetes Element namens SignCertificate enthalten. Beide untergeordneten Elemente enthalten boolesche Werte.
    • SecurityLevel. Dieses Element sollte ignoriert werden.
    • ManufacturerData. Gibt den Hersteller und das Modell des Grafikgeräts an. Dieses Element ist nur informal.
    • Features: Enthält untergeordnete Elemente, die die Verwendung des Zertifikats angeben. Das einzige für COPP relevante Element ist das COPPCertificate-Element. Möglicherweise sind andere untergeordnete Elemente vorhanden; wenn ja, sollten sie ignoriert werden. Wenn das COPPCertificate-Element vorhanden ist, ist das Zertifikat ein COPP-Zertifikat. Dieses Element muss im Blattknoten eines gültigen COPP-Zertifikats vorhanden sein. Dieses Element enthält einen booleschen Wert.
  • Signatur. Enthält die Signatur für dieses Zertifikat. Sie enthält die folgenden untergeordneten Elemente:
    • SignedInfo. Enthält Informationen zur Signatur. Das wichtige untergeordnete Element dieses Elements ist das DigestValue-Element, das den base64-codierten Wert des SHA-1-Hashs über dem Data-Element enthält. Der Digestwert wird verwendet, wenn das Zertifikat anhand der Zertifikatsperrliste (Certificate Revocation List, CRL) überprüft wird.
    • SignatureValue. Dieser Wert wird über das Data-Element berechnet und gemäß dem in Public-Key Cryptography Standards (PKCS) #1 (Version 2.1) definierten rsassa-PSS-Schema für digitale Signaturen berechnet. Informationen zu PKCS #1 finden Sie unter https://www.rsa.com/.
    • KeyInfo. Enthält den öffentlichen RSA-Schlüssel des nächsten Zertifikats in der Kette. Dieses Element wird verwendet, um zu überprüfen, ob die Daten im Data-Element nicht manipuliert wurden. Dieses Element hat das gleiche Format wie das PublicKey-Element.

Zertifikatüberprüfung

Die Anwendung muss die folgenden Schritte ausführen, um die Zertifikatkette ordnungsgemäß zu überprüfen. Wenn ein Schritt fehlschlägt oder ein Element, auf das in diesen Prozeduren verwiesen wird, nicht vorhanden ist, schlägt die Überprüfung fehl.

Überprüfen der Zertifikatsammlungsprozedur

Führen Sie zum Überprüfen der Zertifikatkette die folgenden Schritte aus:

  1. Vergewissern Sie sich, dass die CertificateCollection wohlgeformte XML-Datei ist.
  2. Vergewissern Sie sich, dass die CertificateCollection im UTF-8-Format codiert ist.
  3. Überprüfen Sie, ob das Attribut Version im CertificateCollection-Element 2.0 oder höher ist.
  4. Stellen Sie sicher, dass die Zertifikatkette genau drei Zertifikatelemente enthält.
  5. Durchlaufen Sie jedes Zertifikatelement in der Zertifikatkette, und führen Sie die unten beschriebene Prozedur Zum Überprüfen des Zertifikats für jedes element aus.

Zertifikatüberprüfungsverfahren

Führen Sie zum Überprüfen eines Zertifikats in der Kette die folgenden Schritte aus:

  1. Vergewissern Sie sich, dass keines der untergeordneten Elemente im Data-Element dupliziert ist. Beispielsweise sollte nur ein PublicKey-Element vorhanden sein.
  2. Stellen Sie sicher, dass das Data/PublicKey/KeyValue/RSAKeyValue/Modulus-Element vorhanden ist. Der base64-decodierte Wert muss für alle Zertifikate mit Ausnahme des Stammes 256 Bytes lang sein. Im Stammzertifikat muss dieses Element 128 Bytes lang sein.
  3. Stellen Sie sicher, dass das Data/PublicKey/KeyValue/RSAKeyValue/Exponent-Element vorhanden ist. Der base64-decodierte Wert darf nicht größer als 4 Bytes sein.
  4. Wenn es sich bei diesem Zertifikat um das Blattzertifikat handelt, überprüfen Sie Folgendes:
    • Das KeyUsage-Element enthält ein EncryptKey-Element mit dem Wert 1.
    • Das Features-Element enthält ein COPPCertificate-Element mit dem Wert 1.
  5. Wenn es sich bei diesem Zertifikat nicht um das Blattzertifikat handelt, überprüfen Sie Folgendes:
    • Modul und Exponent aus dem Data/PublicKey-Element stimmen genau mit dem Modulus und Exponenten aus dem Signature/KeyInfo-Element des vorherigen Zertifikats überein.
    • Das KeyUsage-Element enthält ein SignCertificate-Element mit dem Wert 1.
  6. Verwenden Sie den SHA-1-Hashalgorithmus, um jedes Byte im Data-Element des Zertifikats zu hashen. Jedes Byte vom ersten Zeichen im <Data-Tag> bis zum letzten Zeichen im schließenden <Tag /Data> sollte gehasht werden. Der Hashwert wird verwendet, um das Zertifikat anhand der Zertifikatsperrliste (Certificate Revocation List, CRL) zu überprüfen, wie unter Zertifikatsperrlisten beschrieben.
  7. Vergleichen Sie den Hashwert aus Schritt 6 mit dem base64-decodierten Wert des Signature/SignedInfo/Reference/DigestValue-Elements. Diese Werte müssen übereinstimmen.
  8. Führen Sie die unten beschriebene Prozedur zum Überprüfen der Signatur aus.
  9. Wenn dieses Zertifikat nicht das endgültige Zertifikat in der Kette ist, speichern Sie den Wert Signature/KeyInfo/KeyValue/RSAKeyValue für die nächste Iteration der Schleife.
  10. Wenn dieses Zertifikat das endgültige Zertifikat in der Kette ist, stellen Sie sicher, dass der Wert von Signature/KeyInfo/KeyValue/RSAKeyValue mit dem öffentlichen Schlüssel von Microsoft übereinstimmt. Der öffentliche Microsoft-Schlüssel weist die folgenden Base64-codierten Werte auf:
    • Modul:

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

    • Exponent: AQAB

Überprüfen der Signaturprozedur

Der Wert des SignatureValue-Elements wird über das Data-Element gemäß dem digitalen Signaturschema RSASSA-PSS berechnet, das in PKCS #1 Version 2.1 (im Folgenden als PKCS bezeichnet) definiert ist. Führen Sie die folgenden Schritte aus, um diese Signatur zu überprüfen:

  1. Decodieren Sie die Modulus- und Exponent-Werte im Signature/KeyInfo/KeyValue/RSAKeyValue-Element. Diese Werte definieren den öffentlichen RSA-Schlüssel des Signaturzertifikats.
  2. Decodieren Sie das Signature/SignatureValue-Element.
  3. Berechnen Sie den RSASSA-PSS-Verify-Vorgang, der in Abschnitt 8.1.2 von PKCS definiert ist.

Verwenden Sie für den RSASSA-PSS-Verify-Vorgang die folgenden Eingaben:

  • (n,e) ist der öffentliche Schlüssel aus Schritt 1.
  • M ist alle Bytes im Data-Element, einschließlich der <Tags Data> und </Data> , die das Element einschließen.
  • S ist der decodierte Signaturwert aus Schritt 2.

Der RSASSA-PSS-Verify-Vorgang verwendet den EMSA-PSS-ENCODE-Vorgang, der in Abschnitt 9.1.1 definiert ist. von PKCS. Für diesen Vorgang verwendet COPP die folgenden Optionen:

  • Hash = SHA-1
  • hLen = 20
  • MGF (Maskengenerierungsfunktion) = MGF1
  • sLen = 0

Die Maskengenerierungsfunktion MGF1 ist in Anhang B.2 von PKCS definiert. Für diese Funktion verwendet COPP die folgenden Optionen:

  • Hash = SHA-1
  • hLen = 20

Die Ausgabe des RSASSA-PSS-Verify-Vorgangs gibt an, ob die Signatur gültig oder ungültig ist.

Verwenden des Certified Output Protection Protocol (COPP)