Udostępnij za pośrednictwem


Protokół zaświadczania opartego na wirtualizacji (VBS) i modułu TPM (Trusted Platform Module)

Zaświadczanie platformy Microsoft Azure gwarantuje silne bezpieczeństwo, weryfikując łańcuch zaufania, utrzymywany z poziomu głównego modułu TPM do uruchomienia funkcji hypervisor i bezpiecznego jądra. W tym celu zaświadczenie platformy Azure musi świadczyć o stanie rozruchu maszyny, zanim będziemy mogli ustanowić zaufanie do bezpiecznej enklawy. System operacyjny, funkcja hypervisor i bezpieczne pliki binarne jądra muszą być podpisane przez właściwe oficjalne władze firmy Microsoft i skonfigurowane w bezpieczny sposób. Po powiązaniu zaufania między modułem TPM (Trusted Platform Module) i kondycją funkcji hypervisor możemy zaufać identyfikatorom enklaw zabezpieczeń wirtualizacji (VBS) podanych w dzienniku mierzonego rozruchu. Dzięki temu możemy sprawdzić, czy para kluczy została wygenerowana przez enklawę i pomięć raport zaświadczania, który wiąże zaufanie w tym kluczu i zawiera inne oświadczenia, takie jak poziom zabezpieczeń i właściwości zaświadczania rozruchowego.

Enklawy VBS wymagają modułu TPM, aby zapewnić pomiar w celu zweryfikowania podstawy zabezpieczeń. Enklawy VBS są testowane przez punkt końcowy modułu TPM z dodatkiem do obiektu żądania w protokole.

Komunikaty protokołu

Protokół ma dwie wymiany komunikatów:

  • Wiadomość init
  • Komunikat żądania

Wiadomość init

Komunikat w celu ustanowienia kontekstu dla komunikatu żądania.

Kierunek

Klient —> zaświadczenie platformy Azure

Ładunek

{ 
  "type": "aikcert" 
} 

"type" (ciąg ASCII): reprezentuje żądany typ zaświadczania. Obecnie obsługiwany jest tylko element "aikcert".

Komunikat o wyzwaniu

Kierunek

Zaświadczenie platformy Azure —> klient

Ładunek

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

challenge (BASE64URL(OCTETS)): wartość losowa wystawiona przez usługę.

service_context (BASE64URL(OCTETS)): nieprzezroczysty kontekst utworzony przez usługę.

Komunikat żądania

Ładunek zawierający dane, które mają być zaświadczane przez usługę zaświadczania.

Uwaga: Obsługa dzienników pomiarów i kluczy imA została dodana do komunikatu żądania i można je znaleźć w sekcji Komunikat żądania w wersji 2

Komunikat żądania w wersji 1

Kierunek

Klient —> zaświadczenie platformy Azure

Ładunek

{
  "request": "<JWS>"
}

request (JWS): żądanie składa się ze struktury JSON Web Signature (JWS). Poniżej przedstawiono nagłówek chroniony JWS i ładunek JWS. Podobnie jak w każdej strukturze JWS, ostateczna wartość składa się z:

BASE64URL(nagłówek chroniony w formacie UTF8(JWS)) || '.' ||

BASE64URL(Ładunek JWS) || '.' ||

BASE64URL(JWS Signature)

Nagłówek chroniony przez usługę JWS
{
  "alg": "PS256",
  "typ": "attReq"
  // no "kid" parameter as the key specified by attest_key MUST sign this JWS to prove possession.
}
Ładunek JWS

Ładunek JWS może być typu basic lub VBS. Podstawowe jest używane, gdy dowody zaświadczania nie zawierają danych VBS.

Przykład tylko modułu TPM:

{ 
  "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)>" 
  } 
} 

Przykład enklawy MODUŁU TPM i VBS:

{ 
  "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): identyfikator jednostki uzależnionej. Używane przez usługę w obliczeniach oświadczenia o identyfikatorze komputera

rp_data (BASE64URL(OCTETS)): nieprzezroczyste dane przekazywane przez jednostkę uzależnioną. Jest to zwykle używane przez jednostkę uzależnioną jako nonce w celu zagwarantowania aktualności raportu

challenge (BASE64URL(OCTETS)): wartość losowa wystawiona przez usługę

tpm_att_data: dane zaświadczania związane z modułem TPM

  • srtm_boot_log (BASE64URL(OCTETS)): dzienniki rozruchu SRTM pobrane przez funkcję Tbsi_Get_TCG_Log_Ex z typem dziennika = TBS_TCGLOG_SRTM_BOOT

  • srtm_resume_log (BASE64URL(OCTETS)): program SRTM wznawia dziennik pobrany przez funkcję Tbsi_Get_TCG_Log_Ex z typem dziennika = TBS_TCGLOG_SRTM_RESUME

  • drtm_boot_log (BASE64URL(OCTETS)): dzienniki rozruchu DRTM pobrane przez funkcję Tbsi_Get_TCG_Log_Ex z typem dziennika = TBS_TCGLOG_DRTM_BOOT

  • drtm_resume_log (BASE64URL(OCTETS)): FUNKCJA DRTM wznawia dziennik pobrany przez funkcję Tbsi_Get_TCG_Log_Ex z typem dziennika = TBS_TCGLOG_DRTM_RESUME

  • aik_cert (BASE64URL(OCTETS)): certyfikat X.509 dla AIK zwrócony przez funkcję NCryptGetProperty z właściwością = NCRYPT_CERTIFICATE_PROPERTY

  • aik_pub: publiczna część AIK reprezentowana jako obiekt JSON Web Key (JWK) (RFC 7517)

  • current_claim (BASE64URL(OCTETS)): Oświadczenie zaświadczania dla bieżącego stanu PCR zwrócone przez funkcję NCryptCreateClaim z dwClaimType = NCRYPT_CLAIM_PLATFORM i parametru NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK ustawione na uwzględnianie wszystkich żądań PCR. Wyzwanie wysyłane przez usługę powinno być również używane w obliczeniach tego oświadczenia

  • boot_claim (BASE64URL(OCTETS)): Oświadczenie zaświadczania dla stanu PCR podczas rozruchu zwrócone przez funkcję NCryptCreateClaim z dwClaimType = NCRYPT_CLAIM_PLATFORM i parametru NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK ustawione na dołączenie wszystkich żądań PCR

vsm_report (BASE64URL(OCTETS)): raport zaświadczania VBS zwracany przez funkcję EnclaveGetAttestationReport. Parametr EnclaveData musi być skrótem SHA-512 wartości report_signed (w tym nawiasów klamrowych otwierających i zamykających). Dane wejściowe funkcji skrótu to UTF8(report_signed)

attest_key: publiczna część klucza enklawy reprezentowana jako obiekt JSON Web Key (JWK) (RFC 7517)

custom_claims: Tablica niestandardowych oświadczeń enklawy wysyłanych do usługi, które mogą być oceniane przez zasady. Oświadczenie

  • name (Ciąg): nazwa oświadczenia. Ta nazwa zostanie dołączona do adresu URL określonego przez usługę zaświadczania (aby uniknąć konfliktów), a połączony ciąg stanie się typem oświadczenia, którego można użyć w zasadach

  • value (Ciąg): Wartość oświadczenia

  • value_type (ciąg): typ danych wartości oświadczenia

service_context (BASE64URL(OCTETS)): nieprzezroczysty kontekst utworzony przez usługę.

Komunikat raportu

Kierunek

Zaświadczenie platformy Azure —> klient

Ładunek

{
  "report": "<JWT>"
}

report (JWT): raport zaświadczania w formacie JSON Web Token (JWT) (RFC 7519).

Komunikat żądania w wersji 2

{
  "request": "<JWS>"
}

request (JWS): żądanie składa się ze struktury JSON Web Signature (JWS). Poniżej przedstawiono nagłówek chroniony JWS i ładunek JWS. Podobnie jak w każdej strukturze JWS, ostateczna wartość składa się z: BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(Ładunek JWS) || '.' || BASE64URL(JWS Signature)

Nagłówek chroniony przez usługę JWS
{
  "alg": "PS256",
  "typ": "attReqV2"
  // no "kid" parameter as the key specified by request_key MUST sign this JWS to prove possession.
}

Ładunek JWS

Ładunek JWS może być typu basic lub vsm. Podstawowy jest używany, gdy dowody zaświadczania nie zawierają danych programu VSM.

Podstawowy przykład:

{
  "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)>"
  }
}

Przykład enklawy modułu TPM i VBS:

{
  "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): identyfikator jednostki uzależnionej. Używany przez usługę w obliczeniach oświadczenia o identyfikatorze komputera.

rp_data (BASE64URL(OCTETS)): nieprzezroczyste dane przekazywane przez jednostkę uzależnioną. Jest to zwykle używane przez jednostkę uzależnioną jako nonce w celu zagwarantowania aktualności raportu.

challenge (BASE64URL(OCTETS)): wartość losowa wystawiona przez usługę.

  • current_attestation (obiekt): zawiera dzienniki i cudzysłów modułu TPM dla bieżącego stanu systemu (rozruch lub wznawianie). Nie odebrane z usługi musi zostać przekazane do polecenia TPM2_Quote w parametrze "qualifyingData".

  • boot_attestation (obiekt): jest to opcjonalne i zawiera dzienniki oraz cudzysłów modułu TPM zapisany przed hibernacji systemu i wznowienia. boot_attestation informacje muszą być skojarzone z tym samym zimnym cyklem rozruchu (oznacza to, że system był hibernated i wznowiony między nimi).

  • logs (Array(Object)): tablica dzienników. Każdy element tablicy zawiera dziennik, a tablica musi być w kolejności używanej do pomiarów.

    • type (Ciąg): typ dziennika: "TCG" lub "IMA".
    • log (BASE64URL(OCTETS)): dziennik zakodowany jako ciąg BASE64URL.
  • aik_cert (BASE64URL(OCTETS)): certyfikat X.509 reprezentujący zestaw AIK.

  • aik_pub (JWK): publiczna część zestawu AIK reprezentowana jako obiekt JSON Web Key (JWK) (RFC 7517).

  • pcrs (Array(Object)): zawiera zestaw cytowany. Każdy element tablicy reprezentuje bank PCR, a tablica musi być w kolejności użytej do utworzenia oferty. Bank PCR jest definiowany przez jego algorytm i jego wartości (tylko wartości cytowane powinny znajdować się na liście).

    • algorithm (liczba całkowita): wartość UINT16 reprezentująca algorytm wyznaczania wartości skrótu zdefiniowany przez stałe TPM_ALG_ID.
    • values (Array(Object)): tablica wartości szyfrowanych cytowanych. Każdy element tablicy reprezentuje wartość skrótu w banku PCR.
      • index (liczba całkowita): indeks wartości skrótu PCR.
      • skrót (BASE64URL(OCTETS)): wartość skrótu.
    • quote (BASE64URL(OCTETS)): TPMS_ATTEST zwrócone przez polecenie TPM2_Quote. Jeśli to pole znajduje się w obiekcie "current_attestation", wyzwanie odebrane z usługi musi zostać przekazane do polecenia TPM2_Quote w parametrze "qualifyingData". Określona wartość parametru "qualifyingData" zależy od metody powiązania "request_key" i jest opisana w sekcji OBIEKT KLUCZA.
    • signature (BASE64URL(OCTETS)): TPMT_SIGNATURE zwrócone przez polecenie TPM2_Quote. Jeśli to pole znajduje się w obiekcie "current_attestation", wyzwanie odebrane z usługi musi zostać przekazane do polecenia TPM2_Quote w parametrze "qualifyingData". Określona wartość parametru "qualifyingData" zależy od metody powiązania "request_key" i jest opisana w sekcji OBIEKT KLUCZA.

vsm_report (obiekt raportu VSM): raport zaświadczania programu VSM. Zobacz sekcję VSM REPORT OBJECT (OBIEKT RAPORTU PROGRAMU VSM).

request_key (obiekt klucza): klucz używany do podpisywania żądania. Jeśli moduł TPM jest obecny (żądanie zawiera cudzysłów modułu TPM), request_key musi być powiązany z modułem TPM za pośrednictwem cudzysłowu lub być rezydentem w module TPM (zobacz OBIEKT KLUCZA).

other_keys (obiekt Array(Key)): tablica kluczy do wysłania do usługi. Maksymalnie dwa klucze.

custom_claims (Array(Object)): Tablica niestandardowych oświadczeń enklawy wysyłanych do usługi, które mogą być oceniane przez zasady.

  • name (ciąg): nazwa oświadczenia. Ta nazwa zostanie dołączona do adresu URL określonego przez usługę zaświadczania (aby uniknąć konfliktów), a połączony ciąg stanie się typem oświadczenia, którego można użyć w zasadach.

  • value (Ciąg): wartość oświadczenia.

  • value_type (ciąg): typ danych wartości oświadczenia.

service_context (BASE64URL(OCTETS)): nieprzezroczysty, zaszyfrowany kontekst utworzony przez usługę, który obejmuje między innymi wyzwanie i czas wygaśnięcia tego wyzwania.

Obiekt klucza

jwk (obiekt): publiczna część klucza reprezentowana jako obiekt JSON Web Key (JWK) (RFC 7517).

info (obiekt): dodatkowe informacje o kluczu.

Brak dodatkowych informacji:(Obiekt informacji może być pusty lub brakujący w żądaniu)

• Klucz powiązany z modułem TPM za pośrednictwem cudzysłowu:

  • tpm_quote (obiekt): dane metody powiązania cudzysłowu modułu TPM.
  • hash_alg (ciąg): algorytm użyty do utworzenia skrótu przekazanego do polecenia TPM2_Quote w parametrze "qualifyingData". Skrót jest obliczany przez skrót HASH[UTF8(jwk) || 0x00 || || <OCTETS(wyzwanie usługi)>]. Uwaga: KOD UTF8(jwk) musi być dokładnym ciągiem, który zostanie wysłany w sieci, ponieważ usługa obliczy skrót przy użyciu dokładnego ciągu otrzymanego w żądaniu bez modyfikacji.

Uwaga: tej metody powiązania nie można użyć dla kluczy w tablicy other_keys.

• Klucz certyfikowany do zamieszkania w module TPM:

  • tpm_certify (obiekt): dane metody powiązania certyfikacji modułu TPM. "public" (BASE64URL(OCTETS)): TPMT_PUBLIC struktura reprezentująca obszar publiczny klucza w module TPM.

  • certification (BASE64URL(OCTETS)): TPMS_ATTEST zwrócone przez polecenie TPM2_Certify. Wyzwanie odebrane z usługi musi zostać przekazane do polecenia TPM2_Certify w parametrze "qualifyingData". Klucz AIK podany w żądaniu musi być używany do certyfikowania klucza.

  • signature (BASE64URL(OCTETS)): TPMT_SIGNATURE zwrócone przez polecenie TPM2_Certify. Wyzwanie odebrane z usługi musi zostać przekazane do polecenia TPM2_Certify w parametrze "qualifyingData". Klucz AIK podany w żądaniu musi być używany do certyfikowania klucza.

Uwaga: jeśli ta metoda powiązania jest używana dla request_key, wartość parametru "qualifyingData" przekazana do polecenia TPM2_Quote jest po prostu wyzwaniem otrzymanym od usługi.

Przykłady:

Klucz nie jest powiązany z modułem TPM:

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

Klucz powiązany z modułem TPM za pośrednictwem cudzysłowu (rezydent w enklawie VBS lub nie):

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

Klucz certyfikowany do zamieszkania w module TPM:

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

Obiekt klucza zasad

Obiekt klucza zasad jest wersją obiektu klucza używanego jako oświadczenia wejściowe w zasadach. Jest ona przetwarzana przez usługę, aby była bardziej czytelna i łatwiejsza do oceny przez reguły zasad.

• Klucz nie jest powiązany z modułem TPM: taki sam jak odpowiedni obiekt klucza. Przykład:

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

• Klucz powiązany z modułem TPM za pośrednictwem cudzysłowu (rezydent w enklawie VBS lub nie): taki sam jak odpowiedni obiekt klucza. Przykład:

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

• Klucz certyfikowany do zamieszkania w module TPM:

jwk (obiekt): taki sam jak odpowiedni obiekt klucza. info.tpm_certify (obiekt):

  • name_alg (liczba całkowita): wartość UINT16 reprezentująca algorytm wyznaczania wartości skrótu zdefiniowany przez stałe TPM_ALG_ID.
  • obj_attr (liczba całkowita): wartość UINT32 reprezentująca atrybuty obiektu klucza zdefiniowanego przez TPMA_OBJECT
  • auth_policy (BASE64URL(OCTETS)): opcjonalne zasady używania tego obiektu klucza.

Przykład:

{
  "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)>"
    }
  }
}

Obiekt raportu VBS

Zaświadczenie enklawy:

enklawa (obiekt): dane zaświadczania enklawy VSM.

  • report (BASE64URL(OCTETS)): raport zaświadczania usługi VSM zwrócony przez funkcję EnclaveGetAttestationReport. Parametr EnclaveData musi być skrótem SHA-512 wartości report_signed (w tym nawiasów klamrowych otwierających i zamykających). Dane wejściowe funkcji skrótu to UTF8(report_signed).

Przykłady:

Zaświadczenie enklawy:

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

Komunikat raportu

Usługa zaświadczania kierunkowego —> klient

Ładunek

{
  "report": "<JWT>"
}

report (JWT): raport zaświadczania w formacie JSON Web Token (JWT) (RFC 7519).

Następne kroki