Dela via


Verifiera certifikatkedjan

[Funktionen som är associerad med den här sidan, DirectShow, är en äldre funktion. Det har ersatts av MediaPlayer, IMFMediaEngineoch Audio / Video Capture i Media Foundation. Dessa funktioner har optimerats för Windows 10 och Windows 11. Microsoft rekommenderar starkt att ny kod använder MediaPlayer, IMFMediaEngine och Audio/Video Capture i Media Foundation i stället för DirectShow, när det är möjligt. Microsoft föreslår att befintlig kod som använder äldre API:er skrivs om för att använda de nya API:erna om möjligt.]

Det här avsnittet beskriver hur du verifierar drivrutinens certifikatkedja när du använder Certifierat utdataskyddsprotokoll (COPP).

Certifikatkedjan för grafikdrivrutinen är ett XML-dokument. Certifikatkedjan innehåller tre certifikat. Det första certifikatet kallas bladcertifikatoch är förarens COPP-certifikat. Nästa certifikat är signeringscertifikatet för den oberoende maskinvaruleverantören (IHV). Det sista certifikatet är Microsofts signeringscertifikat. För att säkerställa att grafikdrivrutinen är en legitim COPP-enhet måste programmet verifiera alla tre av dessa certifikat. Ett skadligt program kan förhindra att COPP fungerar om ett program inte verifierar certifikaten i kedjan korrekt.

COPP-certifikatkedjor använder UTF-8-teckenuppsättningen. Binära data i certifikaten, till exempel den offentliga RSA-nyckeln, är base64-kodade och lagras i storslutsordning. (Big-endian innebär att den mest signifikanta byten lagras på minnesplatsen med den lägsta adressen.)

Vissa element i ett certifikat innehåller booleska värden som anger att det finns en funktion i certifikatet. Om funktionen finns sätts värdet för det motsvarande underordnade elementet till 1. Om en egenskap inte finns närvarande, finns inte det underordnade elementet i certifikatet.

XML-elementdefinitioner

Följande är definitioner för element i certifikatschemat:

  • CertificateCollection. Rotelementet i XML-dokumentet. Den innehåller certifikatelement, ett för varje certifikat i kedjan.
  • Certifikat. Innehåller ett certifikat. Det här elementet innehåller data- och signaturelement.
  • Data. Innehåller information om certifikatet. I synnerhet innehåller det certifikatets offentliga nyckel och typ. Dataelementet innehåller följande underordnade element:
    • PublicKey. Innehåller certifikatets offentliga RSA-nyckel. PublicKey-elementet innehåller ett KeyValue-element som innehåller ett RSAKeyValue-element. RSAKeyValue-elementet har två underordnade element, Modulus och Exponent, och dessa definierar den offentliga nyckeln. Elementen Modulus och Exponent är base64-kodade och lagras i storslutsordning.
    • KeyUsage. Om certifikatet är drivrutinens COPP-certifikat ska det här elementet innehålla ett underordnat element med namnet EncryptKey. Om certifikatet är IHV:s signeringscertifikat eller Microsofts signeringscertifikat bör det innehålla ett underordnat element med namnet SignCertificate. Båda dessa underordnade element innehåller booleska värden.
    • SecurityLevel. Det här elementet bör ignoreras.
    • ManufacturerData. Anger tillverkaren och modellen för grafikenheten. Det här elementet är endast informationsspecifikt.
    • funktioner. Innehåller underordnade element som anger användningen av certifikatet. Den enda som är relevant för COPP är COPPCertificate-elementet. Andra underordnade element kan finnas. I så fall bör de ignoreras. Om COPPCertificate-elementet finns är certifikatet ett COPP-certifikat. Det här elementet måste finnas i lövnoden för ett giltigt COPP-certifikat. Det här elementet innehåller ett booleskt värde.
  • Signatur. Innehåller signaturen för det här certifikatet. Den innehåller följande underordnade element:
    • SignedInfo. Innehåller information om signaturen. Det viktiga underordnade elementet i det här elementet är elementet DigestValue, som innehåller det base64-kodade värdet för SHA-1-hashen över dataelementet. Sammandragsvärdet används vid kontroll av certifikatet mot listan över återkallade certifikat (CRL).
    • SignatureValue. Det här värdet beräknas över dataelementet och beräknas enligt det RSASSA-PSS digitala signaturschemat som definierats i Public-Key Cryptography Standards (PKCS) #1 (version 2.1). Information om PKCS #1 finns i https://www.rsa.com/.
    • KeyInfo. Innehåller den offentliga RSA-nyckeln för nästa certifikat i kedjan. Det här elementet används för att verifiera att data i dataelementet inte har manipulerats. Det här elementet har samma format som PublicKey-elementet.

Certifikatverifiering

Programmet måste utföra följande steg för att verifiera certifikatkedjan korrekt. Om något steg misslyckas, eller om något element som anges i dessa procedurer inte finns, misslyckas verifieringen.

Verifiera proceduren för insamling av certifikat

Utför följande steg för att verifiera certifikatkedjan:

  1. Kontrollera att CertificateCollection är välformulerad XML.
  2. Kontrollera att CertificateCollection är kodat i UTF-8-format.
  3. Kontrollera att attributet Version i elementet CertificateCollection är 2.0 eller senare.
  4. Kontrollera att certifikatkedjan innehåller exakt tre certifikatelement.
  5. Loopa igenom varje certifikatelement i certifikatkedjan och utför proceduren Verifiera certifikat, som beskrivs nedan, på var och en.

Verifiera certifikatproceduren

Utför följande steg för att verifiera ett certifikat i kedjan:

  1. Kontrollera att inget av de underordnade elementen i dataelementet har duplicerats. Det bör till exempel bara finnas ett PublicKey-element.
  2. Kontrollera att elementet Data/PublicKey/KeyValue/RSAKeyValue/Modulus finns. Det base64-avkodade värdet måste vara 256 byte långt för alla certifikat utom roten. I rotcertifikatet måste det här elementet vara 128 byte långt.
  3. Kontrollera att elementet Data/PublicKey/KeyValue/RSAKeyValue/Exponent finns. Det base64-avkodade värdet får inte vara större än 4 byte.
  4. Om det här certifikatet är lövcertifikatet kontrollerar du följande:
    • KeyUsage-elementet innehåller ett EncryptKey-element med värdet 1.
    • Elementet Funktioner innehåller ett COPPCertificate-element med värdet 1.
  5. Om det här certifikatet inte är lövcertifikatet kontrollerar du följande:
    • Modulus- och exponenten från elementet Data/PublicKey matchar exakt modulus och exponent från elementet Signature/KeyInfo i föregående certifikat.
    • KeyUsage-elementet innehåller ett SignCertificate-element med värdet 1.
  6. Använd SHA-1-hashalgoritmen för att hash varje byte i certifikatets dataelement. Varje byte från det första tecknet i taggen <Data> till det sista tecknet i den avslutande taggen </Data> ska hashas. Hash-värdet används för att kontrollera certifikatet mot listan över återkallade certifikat (CRL), enligt beskrivningen i listor över återkallade certifikat
  7. Jämför hash-värdet från steg 6 med det base64-avkodade värdet för elementet Signature/SignedInfo/Reference/DigestValue. Dessa värden måste matcha.
  8. Utför proceduren Verifiera signatur, som beskrivs nedan.
  9. Om det här certifikatet inte är det slutliga certifikatet i kedjan sparar du värdet Signature/KeyInfo/KeyValue/RSAKeyValue för nästa iteration av loopen.
  10. Om det här certifikatet är det slutliga certifikatet i kedjan kontrollerar du att värdet för Signature/KeyInfo/KeyValue/RSAKeyValue matchar Microsofts offentliga nyckel. Microsofts offentliga nyckel har följande base64-kodade värden:
    • Modulus:

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

    • Exponent: AQAB

Verifiera signaturprocessen

Värdet för elementet SignatureValue beräknas över dataelementet enligt det RSASSA-PSS digitala signaturschemat som definierats i PKCS #1 version 2.1 (nedan kallat PKCS). Utför följande steg för att verifiera signaturen:

  1. Avkoda värdena Modulus och Exponent i elementet Signature/KeyInfo/KeyValue/RSAKeyValue. Dessa värden definierar den offentliga RSA-nyckeln för signeringscertifikatet.
  2. Avkoda Signature/SignatureValue-elementet.
  3. Beräkna åtgärden RSASSA–PSS-Verify som definieras i avsnitt 8.1.2 i PKCS.

Använd följande indata för åtgärden RSASSA-PSS-Verify:

  • (n,e) är den offentliga nyckeln från steg 1.
  • M är alla byte i dataelementet, inklusive taggarna <Data> och </Data> som omger elementet.
  • S är det avkodade signaturvärdet från steg 2.

Åtgärden RSASSA-PSS-Verify använder EMSA-PSS-ENCODE åtgärd som definieras i avsnitt 9.1.1. av PKCS. För den här åtgärden använder COPP följande alternativ:

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

Maskgenereringsfunktionen MGF1 definieras i bilaga B.2 i PKCS. För den här funktionen använder COPP följande alternativ:

  • Hash = SHA-1
  • hLen = 20

Utdata från åtgärden RSASSA-PSS-Verify anger om signaturen är giltig eller ogiltig.

Använda certifierat utdataskyddsprotokoll (COPP)