Freigeben über


Trusted Platform Module (TPM) und Nachweisprotokoll für die VBS-Enclave (virtualisierungsbasierte Sicherheit)

Der Microsoft Azure-Nachweis garantiert eine starke Sicherheit, indem eine Vertrauenskette überprüft wird, die von einem Vertrauensstamm (TPM) bis zum Start des Hypervisors und des sicheren Kernels verwaltet wird. Dazu muss der Azure-Nachweis den Startstatus des Computers bestätigen, bevor wir das Vertrauen in die sichere Enklave herstellen können. Die Binärdateien für Betriebssystem, Hypervisor und sicheren Kernel müssen von den richtigen offiziellen Microsoft-Stellen signiert und sicher konfiguriert werden. Nachdem die Vertrauensstellung zwischen Trusted Platform Module (TPM) und Integrität des Hypervisors sichergestellt wurde, können auch die im Protokoll zum kontrollierten Start bereitgestellten IDKs der VBS-Enclave (virtualisierungsbasierte Sicherheit) als vertrauenswürdig eingestuft werden. Damit kann dann überprüft werden, ob von der Enclave ein Schlüsselpaar generiert wurde, und ein Nachweisbericht erstellt werden, der die Vertrauensstellung mit dem Schlüssel bindet und andere Ansprüche enthält, z. B. die Sicherheitsebene und die Nachweiseigenschaften für den Start.

VBS-Enclaves erfordern ein TPM für die Messung zum Überprüfen der Sicherheitsbaseline. Der Nachweis für VBS-Enclaves erfolgt durch den TPM-Endpunkt, der im Protokoll ein Anforderungsobjekt hinzufügt.

Protokollnachrichten

Das Protokoll verfügt über zwei Nachrichtenaustausch:

  • Init-Nachricht
  • Anforderungsnachricht

Init-Nachricht

Nachricht zum Einrichten des Kontexts für die Anforderungsnachricht.

Direction

Client ->> Azure Attestation

Payload

{ 
  "type": "aikcert" 
} 

„type“ (ASCII-Zeichenfolge): steht für den Typ des angeforderten Nachweises. Derzeit wird nur „aikcert“ unterstützt.

Challenge-Nachricht

Direction

Azure Attestation -> Client

Payload

{ 
  "challenge": "<BASE64URL(CHALLENGE)>", 
  "service_context": "<BASE64URL(SERVICECONTEXT)>" 
} 

challenge (BASE64URL(OCTETS)): Zufallswert, der vom Dienst ausgegeben wird.

service_context (BASE64URL(OCTETS)): Undurchsichtiger Kontext, der vom Dienst erstellt wurde.

Anforderungsnachricht

Nutzdaten mit den Daten, die vom Nachweisdienst bestätigt werden sollen.

Hinweis: Die Unterstützung für IMA-Messprotokolle und -schlüssel wurde der Anforderungsnachricht hinzugefügt und ist im Abschnitt „Anforderungsnachricht v2“ zu finden.

Anforderungsnachricht v1

Direction

Client ->> Azure Attestation

Payload

{
  "request": "<JWS>"
}

request (JWS): Request besteht aus einer JSON Web Signature (JWS)-Struktur. Der geschützte JWS-Header und die JWS-Payload werden unten gezeigt. Wie bei jeder JWS-Struktur besteht der endgültige Wert aus Folgendem:

BASE64URL(UTF8(geschützter JWS-Header)) || '.' ||

BASE64URL(JWS-Payload) || '.' ||

BASE64URL(JWS-Signatur)

Geschützter JWS-Header
{
  "alg": "PS256",
  "typ": "attReq"
  // no "kid" parameter as the key specified by attest_key MUST sign this JWS to prove possession.
}
JWS-Nutzdaten

Die JWS-Payload kann als Wert „basic“ oder „VBS“ aufweisen. „Basic“ wird verwendet, wenn der Beweis für einen Nachweis keine VBS-Daten enthält.

Nur TPM-Beispiel:

{ 
  "att_type": "basic", 
  "att_data": { 
    "rp_id": "<URL>", 
    "rp_data": "<BASE64URL(RPCUSTOMDATA)>", 
    "challenge": "<BASE64URL(CHALLENGE)>", 

    "tpm_att_data": { 
      "srtm_boot_log": "<BASE64URL(SRTMBOOTLOG)>", 
      "srtm_resume_log": "<BASE64URL(SRTMRESUMELOG)>", 
      "drtm_boot_log": "<BASE64URL(DRTMBOOTLOG)>", 
      "drtm_resume_log": "<BASE64URL(DRTMRESUMELOG)>", 
      "aik_cert": "<BASE64URL(AIKCERTIFICATE)>", 

      // aik_pub is represented as a JSON Web Key (JWK) object (RFC 7517). 

      "aik_pub": { 
        "kty": "RSA", 
        "n": "<Base64urlUInt(MODULUS)>", 
        "e": "<Base64urlUInt(EXPONENT)>" 
      }, 
      "current_claim": "<BASE64URL(CURRENTCLAIM)>", 
      "boot_claim": "<BASE64URL(BOOTCLAIM)>" 
    }, 

    // attest_key is represented as a JSON Web Key (JWK) object (RFC 7517). 

    "attest_key": { 
      "kty": "RSA", 
      "n": "<Base64urlUInt(MODULUS)>", 
      "e": "<Base64urlUInt(EXPONENT)>" 
    }, 
    "custom_claims": [ 
      { 
        "name": "<name>", 
        "value": "<value>", 
        "value_type": "<value_type>" 
      }, 
      { 
        "name": "<name>", 
        "value": "<value>", 
        "value_type": "<value_type>" 
      } 
    ], 
    "service_context": "<BASE64URL(SERVICECONTEXT)>" 
  } 
} 

Beispiel mit TPM und VBS-Enclave:

{ 
  "att_type": "vbs", 
  "att_data": { 
    "report_signed": { 
      "rp_id": "<URL>", 
      "rp_data": "<BASE64URL(RPCUSTOMDATA)>", 
      "challenge": "<BASE64URL(CHALLENGE)>", 
      "tpm_att_data": { 
        "srtm_boot_log": "<BASE64URL(SRTMBOOTLOG)>", 
        "srtm_resume_log": "<BASE64URL(SRTMRESUMELOG)>", 
        "drtm_boot_log": "<BASE64URL(DRTMBOOTLOG)>", 
        "drtm_resume_log": "<BASE64URL(DRTMRESUMELOG)>", 
        "aik_cert": "<BASE64URL(AIKCERTIFICATE)>", 

        // aik_pub is represented as a JSON Web Key (JWK) object (RFC 7517). 

        "aik_pub": { 
          "kty": "RSA", 
          "n": "<Base64urlUInt(MODULUS)>", 
          "e": "<Base64urlUInt(EXPONENT)>" 
        }, 
        "current_claim": "<BASE64URL(CURRENTCLAIM)>", 
        "boot_claim": "<BASE64URL(BOOTCLAIM)>" 
      }, 

      // attest_key is represented as a JSON Web Key (JWK) object (RFC 7517). 

      "attest_key": { 
        "kty": "RSA", 
        "n": "<Base64urlUInt(MODULUS)>", 
        "e": "<Base64urlUInt(EXPONENT)>" 
      }, 
      "custom_claims": [ 
        { 
          "name": "<name>", 
          "value": "<value>", 
          "value_type": "<value_type>" 
        }, 
        { 
          "name": "<name>", 
          "value": "<value>", 
          "value_type": "<value_type>" 
        } 
      ], 
      "service_context": "<BASE64URL(SERVICECONTEXT)>" 
    }, 
    "vsm_report": "<BASE64URL(REPORT)>" 
  } 
} 

rp_id (StringOrURI): Bezeichner der vertrauenden Seite. Dieser wird vom Dienst bei der Berechnung des Anspruchs der Computer-ID verwendet.

rp_data (BASE64URL(OCTETS)): Undurchsichtige Daten, die von der vertrauenden Seite übergeben werden. Die Verwendung erfolgt in der Regel als Nonce durch die vertrauende Seite, um die Aktualität eines Berichts zu gewährleisten.

Challenge (BASE64URL(OCTETS)): Zufallswert, der vom Dienst ausgegeben wird

tpm_att_data: TPM-bezogene Nachweisdaten

  • srtm_boot_log (BASE64URL(OCTETS)): SRTM-Startprotokolle, wie von Funktion Tbsi_Get_TCG_Log_Ex mit Protokolltyp = TBS_TCGLOG_SRTM_BOOT

  • srtm_resume_log (BASE64URL(OCTETS)): SRTM setzt das Protokoll nach Funktion Tbsi_Get_TCG_Log_Ex mit dem Protokolltyp = TBS_TCGLOG_SRTM_RESUME

  • drtm_boot_log (BASE64URL(OCTETS)): DRTM-Startprotokolle, wie von Funktion Tbsi_Get_TCG_Log_Ex mit Protokolltyp = TBS_TCGLOG_DRTM_BOOT

  • drtm_resume_log (BASE64URL(OCTETS): DRTM setzt das Protokoll nach Funktion Tbsi_Get_TCG_Log_Ex mit dem Protokolltyp = TBS_TCGLOG_DRTM_RESUME

  • aik_cert (BASE64URL(OCTETS): Das X.509-Zertifikat für die AIK, wie von der Funktion NCryptGetProperty mit eigenschaft = NCRYPT_CERTIFICATE_PROPERTY

  • aik_pub: Der öffentliche Teil der AIK, dargestellt als JSON Web Key (JWK)-Objekt (RFC 7517)

  • current_claim (BASE64URL(OCTETS): Der Nachweisanspruch für den aktuellen PCR-Zustand, wie von der Funktion NCryptCreateClaim mit dwClaimType = NCRYPT_CLAIM_PLATFORM und Parameter zurückgegeben NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK festgelegt, um alle PCRs einzuschließen. Der vom Dienst gesendete challenge-Wert sollte auch für die Berechnung dieses Anspruchs verwendet werden.

  • boot_claim (BASE64URL(OCTETS): Der Nachweisanspruch für den PCR-Zustand beim Start wie von der Funktion NCryptCreateClaim with dwClaimType = NCRYPT_CLAIM_PLATFORM und Parameter NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK festgelegt, um alle PCRs einzuschließen

vsm_report (BASE64URL(OCTETS)): Hierbei handelt es sich um den Nachweisbericht der VBS-Enclave, wie er von der Funktion EnclaveGetAttestationReport zurückgegeben wird. Beim EnclaveData-Parameter muss es sich um den SHA-512-Hash oder den Wert von report_signed (einschließlich der öffnenden und schließenden Klammer) handeln. Die Hashfunktionseingabe ist UTF8(report_signed).

attest_key: Der öffentliche Teil des Enklavenschlüssels, dargestellt als JSON Web Key (JWK)-Objekt (RFC 7517)

custom_claims: Array von benutzerdefinierten Enklavenansprüchen, die an den Dienst gesendet werden, der von der Richtlinie ausgewertet werden kann. Der Anspruch

  • name (Zeichenfolge): der Name des Anspruchs. Dieser Name wird an eine URL angefügt, die vom Attestation-Dienst bestimmt wurde (um Konflikte zu vermeiden). Die verkettete Zeichenfolge wird zum Typ des Anspruchs, der in der Richtlinie verwendet werden kann.

  • wert (Zeichenfolge): Wert des Anspruchs

  • value_type (Zeichenfolge):Datentyp des Anspruchswerts

service_context (BASE64URL(OCTETS)): Undurchsichtiger Kontext, der vom Dienst erstellt wurde.

Report-Nachricht

Direction

Azure Attestation -> Client

Payload

{
  "report": "<JWT>"
}

report (JWT): Nachweisbericht im JWT-Format (JSON Web Token, RFC 7519).

Anforderungsnachricht v2

{
  "request": "<JWS>"
}

request (JWS): Request besteht aus einer JSON Web Signature (JWS)-Struktur. Der geschützte JWS-Header und die JWS-Payload werden unten gezeigt. Wie bei jeder JWS-Struktur besteht der endgültige Wert aus: BASE64URL(UTF8(geschützter JWS-Header)) || '.' || BASE64URL(JWS-Nutzdaten) || '.' || BASE64URL(JWS-Signatur)

Geschützter JWS-Header
{
  "alg": "PS256",
  "typ": "attReqV2"
  // no "kid" parameter as the key specified by request_key MUST sign this JWS to prove possession.
}

JWS-Nutzdaten

Die JWS-Nutzdaten können den Typ „basic“ oder „vsm“ aufweisen. „Basic“ wird verwendet, wenn der Beweis für einen Nachweis keine VSM-Daten enthält.

Einfaches Beispiel:

{
  "att_type": "basic",
  "att_data": {
    "rp_id": "<URL>",
    "rp_data": "<BASE64URL(RPCUSTOMDATA)>",
    "challenge": "<BASE64URL(CHALLENGE)>",
    "tpm_att_data": {
      "current_attestation": {
        "logs": [
          {
            "type": "TCG",
            "log": "<BASE64URL(CURRENT_LOG1)>"
          },
          {
            "type": "TCG",
            "log": "<BASE64URL(CURRENT_LOG2)>"
          },
          {
            "type": "TCG",
            "log": "<BASE64URL(CURRENT_LOG3)>"
          }
        ],
        "aik_cert": "<BASE64URL(AIKCERTIFICATE)>",
        // aik_pub is represented as a JSON Web Key (JWK) object (RFC 7517).
        "aik_pub": {
          "kty": "RSA",
          "n": "<Base64urlUInt(MODULUS)>",
          "e": "<Base64urlUInt(EXPONENT)>"
        },
        "pcrs": [
          {
            "algorithm": 4, // TPM_ALG_SHA1
            "values": [
              {
                "index": 0,
                "digest": "<BASE64URL(DIGEST)>"
              },
              {
                "index": 5,
                "digest": "<BASE64URL(DIGEST)>"
              }
            ]
          },
          {
            "algorithm": 11, // TPM_ALG_SHA256
            "values": [
              {
                "index": 2,
                "digest": "<BASE64URL(DIGEST)>"
              },
              {
                "index": 1,
                "digest": "<BASE64URL(DIGEST)>"
              }
            ]
          }
        ],
        "quote": "<BASE64URL(TPMS_ATTEST)>",
        "signature": "<BASE64URL(TPMT_SIGNATURE)>"
      },
      "boot_attestation": {
        "logs": [
          {
            "type": "TCG",
            "log": "<BASE64URL(BOOT_LOG1)>"
          },
          {
            "type": "TCG",
            "log": "<BASE64URL(BOOT_LOG2)>"
          }
        ],
        "aik_cert": "<BASE64URL(AIKCERTIFICATE)>",
        // aik_pub is represented as a JSON Web Key (JWK) object (RFC 7517).
        "aik_pub": {
          "kty": "RSA",
          "n": "<Base64urlUInt(MODULUS)>",
          "e": "<Base64urlUInt(EXPONENT)>"
        },
        "pcrs": [
          {
            "algorithm": 4, // TPM_ALG_SHA1
            "values": [
              {
                "index": 0,
                "digest": "<BASE64URL(DIGEST)>"
              },
              {
                "index": 5,
                "digest": "<BASE64URL(DIGEST)>"
              }
            ]
          },
          {
            "algorithm": 11, // TPM_ALG_SHA256
            "values": [
              {
                "index": 2,
                "digest": "<BASE64URL(DIGEST)>"
              },
              {
                "index": 1,
                "digest": "<BASE64URL(DIGEST)>"
              }
            ]
          }
        ],
        "quote": "<BASE64URL(TPMS_ATTEST)>",
        "signature": "<BASE64URL(TPMT_SIGNATURE)>"
      }
    },
    "request_key": {
      "jwk": {
        "kty": "RSA",
        "n": "<Base64urlUInt(MODULUS)>",
        "e": "<Base64urlUInt(EXPONENT)>"
      },
      "info": {
        "tpm_quote": {
          "hash_alg": "sha-256"
        }
      }
    },
    "other_keys": [
      {
        "jwk": {
          "kty": "RSA",
          "n": "<Base64urlUInt(MODULUS)>",
          "e": "<Base64urlUInt(EXPONENT)>"
        },
        "info": {
          "tpm_certify": {
            "public": "<BASE64URL(TPMT_PUBLIC)>",
            "certification": "<BASE64URL(TPMS_ATTEST)>",
            "signature": "<BASE64URL(TPMT_SIGNATURE)>"
          }
        }
      },
      {
        "jwk": {
          "kty": "RSA",
          "n": "<Base64urlUInt(MODULUS)>",
          "e": "<Base64urlUInt(EXPONENT)>"
        }
      }
    ],
    "custom_claims": [
      {
        "name": "<name>",
        "value": "<value>",
        "value_type": "<value_type>"
      },
      {
        "name": "<name>",
        "value": "<value>",
        "value_type": "<value_type>"
      }
    ],
    "service_context": "<BASE64URL(SERVICECONTEXT)>"
  }
}

Beispiel mit TPM und VBS-Enclave:

{
  "att_type": "vbs",
  "att_data": {
    "report_signed": {
      "rp_id": "<URL>",
      "rp_data": "<BASE64URL(RPCUSTOMDATA)>",
      "challenge": "<BASE64URL(CHALLENGE)>",
      "tpm_att_data": {
        "current_attestation": {
        "logs": [
            {
              "type": "TCG",
              "log": "<BASE64URL(CURRENT_LOG1)>"
            },
            {
              "type": "TCG",
              "log": "<BASE64URL(CURRENT_LOG2)>"
            },
            {
              "type": "TCG",
              "log": "<BASE64URL(CURRENT_LOG3)>"
            }
          ],
          "aik_cert": "<BASE64URL(AIKCERTIFICATE)>",
          // aik_pub is represented as a JSON Web Key (JWK) object (RFC 7517).
          "aik_pub": {
            "kty": "RSA",
            "n": "<Base64urlUInt(MODULUS)>",
            "e": "<Base64urlUInt(EXPONENT)>"
          },
          "pcrs": [
            {
              "algorithm": 4, // TPM_ALG_SHA1
              "values": [
                {
                  "index": 0,
                  "digest": "<BASE64URL(DIGEST)>"
                },
                {
                  "index": 5,
                  "digest": "<BASE64URL(DIGEST)>"
                }
              ]
            },
            {
              "algorithm": 11, // TPM_ALG_SHA256
              "values": [
                {
                  "index": 2,
                  "digest": "<BASE64URL(DIGEST)>"
                },
                {
                  "index": 1,
                  "digest": "<BASE64URL(DIGEST)>"
                }
              ]
            }
          ],
          "quote": "<BASE64URL(TPMS_ATTEST)>",
          "signature": "<BASE64URL(TPMT_SIGNATURE)>"
        },
        "boot_attestation": {
          "logs": [
            {
              "type": "TCG",
              "log": "<BASE64URL(BOOT_LOG1)>"
            },
            {
              "type": "TCG",
              "log": "<BASE64URL(BOOT_LOG2)>"
            }
          ],
          "aik_cert": "<BASE64URL(AIKCERTIFICATE)>",
          // aik_pub is represented as a JSON Web Key (JWK) object (RFC 7517).
          "aik_pub": {
            "kty": "RSA",
            "n": "<Base64urlUInt(MODULUS)>",
            "e": "<Base64urlUInt(EXPONENT)>"
          },
          "pcrs": [
            {
              "algorithm": 4, // TPM_ALG_SHA1
              "values": [
                {
                  "index": 0,
                  "digest": "<BASE64URL(DIGEST)>"
                },
                {
                  "index": 5,
                  "digest": "<BASE64URL(DIGEST)>"
                }
              ]
            },
            {
              "algorithm": 11, // TPM_ALG_SHA256
              "values": [
                {
                  "index": 2,
                  "digest": "<BASE64URL(DIGEST)>"
                },
                {
                  "index": 1,
                  "digest": "<BASE64URL(DIGEST)>"
                }
              ]
            }
          ],
          "quote": "<BASE64URL(TPMS_ATTEST)>",
          "signature": "<BASE64URL(TPMT_SIGNATURE)>"
        }
      },
      "request_key": {
        "jwk": {
          "kty": "RSA",
          "n": "<Base64urlUInt(MODULUS)>",
          "e": "<Base64urlUInt(EXPONENT)>"
        },
        "info": {
          "tpm_quote": {
            "hash_alg": "sha-256"
          }
        }
      },
      "other_keys": [
        {
          "jwk": {
            "kty": "RSA",
            "n": "<Base64urlUInt(MODULUS)>",
            "e": "<Base64urlUInt(EXPONENT)>"
          },
          "info": {
            "tpm_certify": {
              "public": "<BASE64URL(TPMT_PUBLIC)>",
              "certification": "<BASE64URL(TPMS_ATTEST)>",
              "signature": "<BASE64URL(TPMT_SIGNATURE)>"
            }
          }
        },
        {
          "jwk": {
            "kty": "RSA",
            "n": "<Base64urlUInt(MODULUS)>",
            "e": "<Base64urlUInt(EXPONENT)>"
          }
        }
      ],
      "custom_claims": [
        {
          "name": "<name>",
          "value": "<value>",
          "value_type": "<value_type>"
        },
        {
          "name": "<name>",
          "value": "<value>",
          "value_type": "<value_type>"
        }
      ],
      "service_context": "<BASE64URL(SERVICECONTEXT)>"
    },
    "vsm_report": {
      "enclave": {
        "report": "<BASE64URL(REPORT)>"
      }
    }
  }
}

rp_id (StringOrURI): Bezeichner der vertrauenden Seite. Dieser wird vom Dienst bei der Berechnung des Anspruchs der Computer-ID verwendet.

rp_data (BASE64URL(OCTETS)): Undurchsichtige Daten, die von der vertrauenden Seite übergeben werden. Die Verwendung erfolgt in der Regel als Nonce durch die vertrauende Seite, um die Aktualität eines Berichts zu gewährleisten.

challenge (BASE64URL(OCTETS)): Zufallswert, der vom Dienst ausgegeben wird.

  • current_attestation (Objekt): enthält Protokolle und TPM-Antwort für den aktuellen Zustand des Systems („boot“ oder „resume“). Die vom Dienst empfangene Nonce muss im qualifyingData-Parameter an den Befehl TPM2_Quote übergeben werden.

  • boot_attestation (Objekt): optionales Objekt mit Protokollen und TPM-Antwort, das vor dem Ruhezustand und der erneuten Aktivierung des Systems gespeichert wurde. boot_attestation Informationen müssen demselben Kaltstartzyklus zugeordnet werden (d. r. das System wurde nur zwischen ihnen ruhen und fortgesetzt).

  • logs (Array(Objekt)): Array von Protokollen. Jedes Element des Arrays enthält ein Protokoll, und das Array muss sich in der Reihenfolge befinden, die für Messungen verwendet wurde.

    • type (Zeichenfolge): Typ des Protokolls: „TCG“ oder „IMA“.
    • log (BASE64URL(Oktette)): das Protokoll als Zeichenfolge im BASE64URL-Format.
  • aik_cert (BASE64URL(Oktette)): das X.509-Zertifikat, das den AIK darstellt.

  • aik_pub (JWK): der öffentliche Teil des AIK dargestellt als JWK-Objekt (JSON Web Key, RFC 7517).

  • pcrs (Array(Objekt)): enthält die Antworten. Jedes Element des Arrays stellt eine PCR-Bank dar, und das Array muss sich in der Reihenfolge befinden, die zum Erstellen der Antwort verwendet wurde. Eine PCR-Bank wird durch ihren Algorithmus und ihre Werte definiert (nur die Antwortwerte sollten in der Liste enthalten sein).

    • algorithm (Integer): UINT16-Wert, der einen durch die TPM_ALG_ID-Konstanten definierten Hashalgorithmus darstellt.
    • values (Array(Objekt)): Array von Hashwerten in der Antwort. Jedes Element des Arrays stellt einen Hashwert in der PCR-Bank dar.
      • index (Integer): Index des PCR-Hashwerts.
      • digest (BASE64URL(Oktette)): Hashwert.
    • quote (BASE64URL(Oktette)): der vom Befehl TPM2_Quote zurückgegebene TPMS_ATTEST. Wenn sich dieses Feld im current_attestation-Objekt befindet, muss die vom Dienst empfangene Abfrage im qualifyingData-Parameter an den Befehl TPM2_Quote übergeben werden. Der spezifische Wert des qualifyingData-Parameters hängt von der Bindungsmethode in „request_key“ ab und wird im Abschnitt KEY OBJECT beschrieben.
    • signature (BASE64URL(Oktette)): die vom Befehl TPM2_Quote zurückgegebene TPMT_SIGNATURE. Wenn sich dieses Feld im current_attestation-Objekt befindet, muss die vom Dienst empfangene Abfrage im qualifyingData-Parameter an den Befehl TPM2_Quote übergeben werden. Der spezifische Wert des qualifyingData-Parameters hängt von der Bindungsmethode in „request_key“ ab und wird im Abschnitt KEY OBJECT beschrieben.

vsm_report (VSM-Berichtsobjekt): der VSM-Nachweisbericht. Weitere Informationen finden Sie im Abschnitt VSM-BERICHTSOBJEKT.

request_key (Schlüsselobjekt): Schlüssel zum Signieren der Anforderung. Wenn ein TPM vorhanden ist (die Anforderung enthält eine TPM-Antwort), muss request_key entweder über die Antwort an das TPM gebunden werden oder sich im TPM befinden (siehe SCHLÜSSELOBJEKT).

other_keys (Array(Schlüsselobjekt)): Array von Schlüsseln, die an den Dienst gesendet werden sollen. Maximal zwei Tasten.

custom_claims (Array(Objekt)): Array benutzerdefinierter Enclave-Ansprüche, die an den Dienst gesendet und von der Richtlinie ausgewertet werden können.

  • name (Zeichenfolge): der Name des Anspruchs. Dieser Name wird an eine URL angefügt, die vom Attestation-Dienst bestimmt wurde (um Konflikte zu vermeiden). Die verkettete Zeichenfolge wird zum Typ des Anspruchs, der in der Richtlinie verwendet werden kann.

  • value (Zeichenfolge): der Wert des Anspruchs.

  • value_type (Zeichenfolge): der Datentyp des Anspruchswerts.

service_context (BASE64URL(OCTETS)): Undurchsichtiger, verschlüsselter Kontext, der vom Dienst erstellt wurde, der unter anderem die Herausforderung und eine Ablaufzeit für diese Herausforderung enthält.

Schlüsselobjekt

jwk (Objekt): der öffentliche Teil des Schlüssels dargestellt als JWK-Objekt (JSON Web Key, RFC 7517).

info (Objekt): zusätzliche Informationen zum Schlüssel.

Keine zusätzlichen Informationen: (info-Objekt kann leer sein oder in der Anforderung fehlen)

• Schlüssel, der aus der Antwort an das TPM gebunden ist:

  • tpm_quote (Objekt): Daten für die Bindungsmethode der TPM-Antwort.
  • hash_alg (Zeichenfolge): der Algorithmus zum Erstellen des Hashwerts, der an den Befehl TPM2_Quote im qualifyingData-Parameter übergeben wird. Der Hash wird mit HASH[UTF8(jwk) || 0x00 || <Oktette(Dienstabfrage)>] berechnet. Hinweis: „UTF8(jwk)“ muss genau die Zeichenfolge sein, die über die Leitung gesendet wird, da der Dienst den Hash mithilfe der exakten Zeichenfolge ohne Änderungen berechnet, die in der Anforderung empfangen wurde.

Hinweis: Diese Bindungsmethode kann nicht für Schlüssel im other_keys-Array verwendet werden.

• Schlüssel, der als im TPM befindlich zertifiziert ist:

  • tpm_certify (Objekt): Daten für die Bindungsmethode für die TPM-Zertifizierung. „public“ (BASE64URL(Oktette)): TPMT_PUBLIC-Struktur, die den öffentlichen Teil des Schlüssels im TPM darstellt.

  • certification (BASE64URL(Oktette)): der vom Befehl TPM2_Certify zurückgegebene TPMS_ATTEST. Die vom Dienst empfangene Abfrage muss im qualifyingData-Parameter an den Befehl TPM2_Certify übergeben werden. Der Schlüssel muss mit dem in der Anforderung angegebenen AIK zertifiziert sein.

  • signature (BASE64URL(Oktette)): die vom Befehl TPM2_Certify zurückgegebene TPMT_SIGNATURE. Die vom Dienst empfangene Abfrage muss im qualifyingData-Parameter an den Befehl TPM2_Certify übergeben werden. Der Schlüssel muss mit dem in der Anforderung angegebenen AIK zertifiziert sein.

Hinweis: Wenn diese Bindungsmethode für request_key verwendet wird, ist der an den Befehl TPM2_Quote übergebene Wert des qualifyingData-Parameters einfach die vom Dienst empfangene Abfrage.

Beispiele:

Schlüssel nicht an das TPM gebunden:

{
  "jwk": {
    "kty": "RSA",
    "n": "<Base64urlUInt(MODULUS)>",
    "e": "<Base64urlUInt(EXPONENT)>"
  }
}

Schlüssel über die Antwort an das TPM gebunden (in VBS-Enclave oder nicht):

{
  "jwk": {
    "kty": "RSA",
    "n": "<Base64urlUInt(MODULUS)>",
    "e": "<Base64urlUInt(EXPONENT)>"
  },
  "info": {
    "tpm_quote":
      "hash_alg": "sha-256"
    }
  }
}

Schlüssel, der als im TPM befindlich zertifiziert ist:

{
  "jwk": {
    "kty": "RSA",
    "n": "<Base64urlUInt(MODULUS)>",
    "e": "<Base64urlUInt(EXPONENT)>"
  },
  "info": {
    "tpm_certify": {
      "public": "<BASE64URL(TPMT_PUBLIC)>",
      "certification": "<BASE64URL(TPMS_ATTEST)>",
      "signature": "<BASE64URL(TPMT_SIGNATURE)>"
    }
  }
}

Richtlinienschlüsselobjekt

Das Richtlinienschlüsselobjekt ist die Version des Schlüsselobjekts, das als Eingabeanspruch in der Richtlinie verwendet wird. Es wird vom Dienst verarbeitet, um die Lesbarkeit zu verbessern und die Auswertung durch Richtlinienregeln zu vereinfachen.

• Schlüssel nicht an das TPM gebunden: identisch mit dem zugehörigen Schlüsselobjekt. Beispiel:

{
  "jwk": {
    "kty": "RSA",
    "n": "<Base64urlUInt(MODULUS)>",
    "e": "<Base64urlUInt(EXPONENT)>"
  }
}

• Schlüssel über Antwort an das TPM gebunden (in VBS-Enclave oder nicht): identisch mit dem zugehörigen Schlüsselobjekt. Beispiel:

{
  "jwk": {
    "kty": "RSA",
    "n": "<Base64urlUInt(MODULUS)>",
    "e": "<Base64urlUInt(EXPONENT)>"
  },
  "info": {
    "tpm_quote":
      "hash_alg": "sha-256"
    }
  }
}

• Schlüssel, der als im TPM befindlich zertifiziert ist:

jwk (Objekt): identisch mit dem zugehörigen Schlüsselobjekt. info.tpm_certify (Objekt):

  • name_alg (Integer): UINT16-Wert, der einen durch die TPM_ALG_ID-Konstanten definierten Hashalgorithmus darstellt.
  • obj_attr (Integer): UINT32-Wert, der die Attribute des Schlüsselobjekts darstellt, das durch TPMA_OBJECT definiert ist
  • auth_policy (BASE64URL(Oktette)): optionale Richtlinie für die Verwendung dieses Schlüsselobjekts.

Beispiel:

{
  "jwk": {
    "kty": "RSA",
    "n": "<Base64urlUInt(MODULUS)>",
    "e": "<Base64urlUInt(EXPONENT)>"
  },
  "info": {
    "tpm_certify": {
      "name_alg": 11, // 0xB (TPM_ALG_SHA256)
      "obj_attr": 50, // 0x32 (fixedTPM | fixedParent | sensitiveDataOrigin)
      "auth_policy": "<BASE64URL(AUTH_POLICY)>"
    }
  }
}

VBS-Berichtsobjekt

Enclave-Nachweis:

enclave (Objekt): Daten für den VSM-Enclave-Nachweis.

  • report (BASE64URL(Oktette)): Nachweisbericht der VSM-Enclave, wie von der EnclaveGetAttestationReport-Funktion zurückgegeben. Beim EnclaveData-Parameter muss es sich um den SHA-512-Hash oder den Wert von report_signed (einschließlich der öffnenden und schließenden Klammer) handeln. Die Hashfunktionseingabe ist „UTF8(report_signed)“.

Beispiele:

Enclave-Nachweis:

{
  "enclave": {
    "report": "<BASE64URL(REPORT)>"
  }
}

Report-Nachricht

Richtung: Attestation-Dienst > Client

Payload

{
  "report": "<JWT>"
}

report (JWT): Nachweisbericht im JWT-Format (JSON Web Token, RFC 7519).

Nächste Schritte