你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

受信任的平台模块 (TPM) 和基于虚拟化的安全 (VBS) enclave 证明协议

Microsoft Azure 证明通过验证信任链(从信任根(TPM)维护到启动虚拟机监控程序和安全内核来保证强大的安全性。 为此,Azure 证明必须证明计算机的启动状态,然后才能在安全 enclave 中建立信任。 操作系统、虚拟机监控程序和安全内核二进制文件必须由正确的官方 Microsoft 机构签署,并以安全的方式进行配置。 一旦在受信任的平台模块 (TPM) 和虚拟机监控程序的健康状况之间建立绑定信任,我们就可以信任已测量的启动日志中提供的基于虚拟化的安全 (VBS) enclave IDK,这样我们就可以验证 enclave 和 mint 生成了密钥对,证明报告在该密钥中绑定信任,并包含安全级别和启动证明属性等其他声明。

VBS enclave 要求使用 TPM 来提供用于验证安全基础的度量。 除协议中的请求对象外,VBS enclave 也由 TPM 终结点证明。

协议消息

协议有两条消息交换:

  • 初始化消息
  • 请求消息

初始化消息

用于建立请求消息上下文的消息。

方向

客户端 -> Azure 证明

有效负载

{ 
  "type": "aikcert" 
} 

“type”(ASCII 字符串):表示所请求证明的类型。 目前仅支持“aikcert”。

质询消息

方向

Azure 证明 -> 客户端

有效负载

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

challenge (BASE64URL(OCTETS)):服务发出的随机值。

service_context (BASE64URL(OCTETS)):服务创建的非跳转上下文。

请求消息

有效负载,包含要由证明服务证明的数据。

注意:请求消息中已经增加了对 IMA 测量日志和密钥的支持,可在“Request Message V2”部分中找到

请求消息 v1

方向

客户端 -> Azure 证明

有效负载

{
  "request": "<JWS>"
}

request (JWS):请求包含一个 JSON Web 签名 (JWS) 结构。 JWS 保护的标头和 JWS 有效负载如下所示。 与任何 JWS 结构一样,最终值由以下内容组成:

BASE64URL(UTF8(JWS保护的标头)) || '.' ||

BASE64URL(JWS有效负载) || '.' ||

BASE64URL(JWS签名)

JWS 保护的标头
{
  "alg": "PS256",
  "typ": "attReq"
  // no "kid" parameter as the key specified by attest_key MUST sign this JWS to prove possession.
}
JWS 有效负载

JWS 有效负载可以是 basic 或 VBS 类型。 当证明证据不包含 VBS 数据时,使用 Basic。

仅限 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)>" 
  } 
} 

TPM + 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):信赖方标识符。 由服务在计算计算机 ID 声明时使用

rp_data (BASE64URL(OCTETS)):信赖方传递的非跳转数据。 这通常由信赖方用作 nonce 来保证报表的新鲜度

challenge (BASE64URL(OCTETS)):服务发出的随机值。

tpm_att_data:与 TPM 相关的证明数据

  • srtm_boot_log (BASE64URL(OCTETS)):由函数 Tbsi_Get_TCG_Log_Ex 检索的 SRTM 启动日志,日志类型 = TBS_TCGLOG_SRTM_BOOT

  • srtm_resume_log (BASE64URL(OCTETS)):由函数 Tbsi_Get_TCG_Log_Ex 检索的 SRTM 恢复日志,日志类型 = TBS_TCGLOG_SRTM_RESUME

  • drtm_boot_log (BASE64URL(OCTETS)):由函数 Tbsi_Get_TCG_Log_Ex 检索的 DRTM 启动日志,日志类型 = TBS_TCGLOG_DRTM_BOOT

  • drtm_resume_log (BASE64URL(OCTETS)):由函数 Tbsi_Get_TCG_Log_Ex 检索的 DRTM 恢复日志,日志类型 = TBS_TCGLOG_DRTM_RESUME

  • aik_cert (BASE64URL(OCTETS)):由函数 NCryptGetProperty 返回的 AIK 的 X.509 证书,属性 = NCRYPT_CERTIFICATE_PROPERTY

  • aik_pub:AIK 的公共部件,表示为 JSON Web 密钥 (JWK) 对象 (RFC 7517)

  • current_claim (BASE64URL(OCTETS)):由函数 NCryptCreateClaim 返回的当前 PCR 状态的证明声明,dwClaimType = NCRYPT_CLAIM_PLATFORM,参数 NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK 设置为包含所有 PCR。 服务发送的质询还应用于计算此声明

  • boot_claim (BASE64URL(OCTETS)):启动时由函数 NCryptCreateClaim 返回的 PCR 状态的证明声明,dwClaimType = NCRYPT_CLAIM_PLATFORM,参数 NCRYPTBUFFER_TPM_PLATFORM_CLAIM_PCR_MASK 设置为包含所有 PCR

vsm_report (BASE64URL(OCTETS)):函数 EnclaveGetAttestationReport 返回的 VBS enclave 证明报告。 EnclaveData 参数必须是 report_signed 的值的 SHA-512 哈希(包括左大括号和右大括号)。 哈希函数输入为 UTF8(report_signed)

attest_key:enclave 密钥的公共部件,表示为 JSON Web 密钥 (JWK) 对象 (RFC 7517)

custom_claims:发送到服务的自定义 enclave 声明数组,该服务可通过策略进行评估。 声明

  • name(字符串):声明的名称。 此名称将追加到由证明服务确定的 url(以避免冲突),连接的字符串成为可在策略中使用的声明的类型

  • value(字符串):声明的值

  • value_type(字符串):声明的值的数据类型

service_context (BASE64URL(OCTETS)):服务创建的非跳转上下文。

报告消息

方向

Azure 证明 -> 客户端

有效负载

{
  "report": "<JWT>"
}

report (JWT):JSON Web 令牌 (JWT) 格式 (RFC 7519) 的证明报告。

请求消息 v2

{
  "request": "<JWS>"
}

request (JWS):请求包含一个 JSON Web 签名 (JWS) 结构。 JWS 保护的标头和 JWS 有效负载如下所示。 正如在任何 JWS 结构中一样,最终值由以下部分组成:BASE64URL(UTF8(JWS 受保护标头)) || '.' || BASE64URL(JWS 有效负载) || '.' || BASE64URL(JWS 签名)

JWS 保护的标头
{
  "alg": "PS256",
  "typ": "attReqV2"
  // no "kid" parameter as the key specified by request_key MUST sign this JWS to prove possession.
}

JWS 有效负载

JWS 有效负载可以是 basic 或 vsm 类型。 当证明证据不包含 VSM 数据时,使用 Basic。

基本示例:

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

TPM + 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):信赖方标识符。 由服务在计算计算机 ID 声明时使用。

rp_data (BASE64URL(OCTETS)):信赖方传递的非跳转数据。 这通常由信赖方用作 nonce 来保证报表的新鲜度。

challenge (BASE64URL(OCTETS)):服务发出的随机值。

  • current_attestation(对象):包含系统当前状态(启动或恢复)的日志和 TPM 引号。 从服务接收的 nonce 必须传递到 TPM2_Quote 命令中的“qualifyingData”参数。

  • boot_attestation(对象):可选,包含在系统休眠和恢复之前保存的日志和 TPM 引号。 boot_attestation信息必须与相同的冷启动周期相关联(也就是说,系统仅在它们之间处于休眠状态并恢复)。

  • logs (Array(Object)):日志的数组。 数组的每个元素都包含一个日志,并且数组必须按照用于测量的顺序排列。

    • type(字符串):日志类型:“TCG”或“IMA”。
    • log (BASE64URL(OCTETS)):编码为 base64url 字符串的日志。
  • aik_cert (BASE64URL(OCTETS)):表示 AIK 的 X.509 证书。

  • aik_pub (JWK):AIK 的公共部件,表示为 JSON Web 密钥 (JWK) 对象 (RFC 7517)。

  • pcrs(数组(对象)):包含引号的集合。 数组的每个元素都表示一个 PCR 库,并且数组必须采用用于创建引号的顺序。 PCR 库由其算法和值定义(只有引号的值才能出现在列表中)。

    • algorithm(整数):UInt16 值,表示由 TPM_ALG_ID 常量定义的哈希算法。
    • Values(数组(对象)):引号摘要值的数组。 数组的每个元素代表 PCR 库中的一个摘要值。
      • index(整数):PCR 摘要值的索引。
      • digest (BASE64URL(OCTETS)):摘要值。
    • quote (BASE64URL(OCTETS)):TPM2_QUOTE 命令返回的 TPMS_ 验证。 如果此字段位于“current_attestation”对象中,则必须将从服务接收的质询传递给 TPM2_Quote 命令中的“qualifyingData”参数。 具体的“QualifyingData ”参数值取决于“request_key”绑定方法,并在密钥对象部分进行了说明。
    • signature (BASE64URL(OCTETS)):TPM2_Quote 命令返回的 TPMT_SIGNATURE。 如果此字段位于“current_attestation”对象中,则必须将从服务接收的质询传递给 TPM2_Quote 命令中的“qualifyingData”参数。 具体的“QualifyingData ”参数值取决于“request_key”绑定方法,并在密钥对象部分进行了说明。

vsm_report(VSM 报表对象):VSM 证明报表。 请参阅“VSM REPORT OBJECT”部分。

request_key(密钥对象):用于签署请求的密钥。 如果存在 TPM(请求包含 TPM 引号),则 request_key 必须通过引号绑定到 TPM,或者驻留在 TPM 中(请参阅 KEY OBJECT)。

other_keys (Array(Key object)):要发送到服务的键的数组。 最多两个键。

custom_claims (Array(Object)):发送到服务的自定义 enclave 声明数组,该服务可通过策略进行评估。

  • name(字符串):声明的名称。 此名称将追加到由证明服务确定的 url(以避免冲突),连接的字符串成为可在策略中使用的声明的类型。

  • value(字符串):声明的值。

  • value_type(字符串):声明的值的数据类型。

service_context(BA标准版64URL(OCTETS)):不透明,由服务创建的加密上下文,其中包括质询和该挑战的过期时间。

项对象

jwk(对象):表示为 JSON Web 密钥 (JWK) 对象 (RFC 7517) 的密钥的公共部分。

info(对象):关于密钥的额外信息。

无额外信息:(请求中的信息对象可以为空或缺失)

•通过引号绑定到 TPM 的密钥:

  • tpm_quote(对象):TPM 引号绑定方法的数据。
  • hash_alg(字符串):用于创建哈希的算法,该哈希将传递给的 TPM2_Quote 命令中的“qualifyingData”参数。 哈希是通过 HASH[UTF8(jwk) || 0x00 || <OCTETS(service challenge)>] 计算的。 注意:UTF8(jwk) 必须是将在网络上发送的确切字符串,因为服务将使用在请求中接收到的未经修改的确切字符串来计算哈希。

注意:此绑定方法不能用于 other_keys 数组中的密钥。

• 经认证可驻留在 TPM 中的密钥:

  • tpm_certify(对象):用于 TPM 证书绑定方法的数据。 “public” (BASE64URL(OCTETS)):TPMT_PUBLIC 结构,表示 TPM 中密钥的公共区域。

  • certification (BASE64URL(OCTETS)):TPM2_Certify 命令返回的 TPMS_ATTEST。 从服务接收的质询必须传递到 TPM2_Certify 命令中的“qualifyingData”参数。 请求中提供的 AIK 必须用于认证密钥。

  • signature (BASE64URL(OCTETS)):TPM2_Certify 命令返回的 TPMT_SIGNATURE。 从服务接收的质询必须传递到 TPM2_Certify 命令中的“qualifyingData”参数。 请求中提供的 AIK 必须用于认证密钥。

注意:将此绑定方法用于 request_key 时,传递给 TPM2_Quote 命令的“qualifyingData”参数值只是从服务收到的质询。

示例:

密钥未绑定到 TPM:

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

通过引号绑定到 TPM 的密钥(无论是否位于 VBS Enclave 中):

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

经认证可驻留在 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)>"
    }
  }
}

策略密钥对象

策略密钥对象是用作策略中的输入声明的密钥对象的版本。 服务对其进行处理,以使其更具可读性并更易于通过策略规则进行评估。

•未绑定到 TPM 的密钥:与相应的密钥对象相同。 示例:

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

• 通过引号绑定到 TPM 的密钥(无论是否驻留在 VBS Enclave 中):与相应的密钥对象相同。 示例:

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

• 经认证可驻留在 TPM 中的密钥:

jwk(对象):与相应的关键对象相同。 info.tpm_certify(对象):

  • name_alg(整数):UInt16 值,表示由 TPM_ALG_ID 常量定义的哈希算法。
  • OBJ_ATTR(整数):UInt32 值,表示由 TPMA_ 对象定义的密钥对象的属性
  • auth_policy (BASE64URL(OCTETS)):使用此密钥对象的可选策略。

示例:

{
  "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 报表对象

Enclave 证明:

enclave(对象):用于 VSM Enclave 证明的数据。

  • report (BASE64URL(OCTETS)):函数 EnclaveGetAttestationReport 返回的 VBS enclave 证明报告。 EnclaveData 参数必须是 report_signed 的值的 SHA-512 哈希(包括左大括号和右大括号)。 哈希函数输入为 UTF8(report_signed)。

示例:

Enclave 证明:

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

报告消息

方向证明服务 - > 客户端

有效负载

{
  "report": "<JWT>"
}

report (JWT):JSON Web 令牌 (JWT) 格式 (RFC 7519) 的证明报告。

后续步骤