chrome.enterprise.platformKeys

说明

使用 chrome.enterprise.platformKeys API 生成密钥并为这些密钥安装证书。这些证书将由平台管理,并可用于 TLS 身份验证、网络访问或其他扩展程序通过 chrome.platformKeys。

权限

enterprise.platformKeys

可用性

仅限 ChromeOS 需要政策

用量

该 API 通常用于注册客户端证书,步骤如下:

  • 使用 enterprise.platformKeys.getTokens 获取所有可用令牌。

  • 找到 id 等于 "user" 的令牌。随后使用此令牌。

  • 使用 generateKey 令牌方法(在 SubtleCrypto 中定义)生成密钥对。这将返回键的句柄。

  • 使用 exportKey 令牌方法(在 SubtleCrypto 中定义)导出公钥。

  • 使用 sign 令牌方法(在 SubtleCrypto 中定义)创建认证请求数据的签名。

  • 完成认证请求并将其发送给认证授权机构。

  • 收到证书后,使用 enterprise.platformKeys.importCertificate 导入该证书

以下示例展示了除构建和发送认证请求之外的主要 API 交互:

function getUserToken(callback) {
  chrome.enterprise.platformKeys.getTokens(function(tokens) {
    for (var i = 0; i < tokens.length; i++) {
      if (tokens[i].id == "user") {
        callback(tokens[i]);
        return;
      }
    }
    callback(undefined);
  });
}

function generateAndSign(userToken) {
  var data = new Uint8Array([0, 5, 1, 2, 3, 4, 5, 6]);
  var algorithm = {
    name: "RSASSA-PKCS1-v1_5",
    // RsaHashedKeyGenParams
    modulusLength: 2048,
    publicExponent:
        new Uint8Array([0x01, 0x00, 0x01]),  // Equivalent to 65537
    hash: {
      name: "SHA-256",
    }
  };
  var cachedKeyPair;
  userToken.subtleCrypto.generateKey(algorithm, false, ["sign"])
    .then(function(keyPair) {
            cachedKeyPair = keyPair;
            return userToken.subtleCrypto.exportKey("spki", keyPair.publicKey);
          },
          console.log.bind(console))
    .then(function(publicKeySpki) {
            // Build the Certification Request using the public key.
            return userToken.subtleCrypto.sign(
                {name : "RSASSA-PKCS1-v1_5"}, cachedKeyPair.privateKey, data);
          },
          console.log.bind(console))
    .then(function(signature) {
              // Complete the Certification Request with |signature|.
              // Send out the request to the CA, calling back
              // onClientCertificateReceived.
          },
          console.log.bind(console));
}

function onClientCertificateReceived(userToken, certificate) {
  chrome.enterprise.platformKeys.importCertificate(userToken.id, certificate);
}

getUserToken(generateAndSign);

类型

Algorithm

Chrome 110 及更高版本

要生成的密钥的类型。

枚举

ChallengeKeyOptions

Chrome 110 及更高版本

属性

  • 质询

    ArrayBuffer

    Verified Access Web API 发出的质询。

  • registerKey

    如果存在,则使用指定 scope 的令牌注册质询的密钥。然后,该密钥可与证书关联,并像使用其他签名密钥一样使用。对此函数的后续调用会在指定的 scope 中生成新的企业密钥。

  • 范围

    要验证哪个企业密钥。

RegisterKeyOptions

Chrome 110 及更高版本

属性

  • 算法

    已注册的密钥应使用哪种算法。

Scope

Chrome 110 及更高版本

是使用企业用户密钥还是企业机器密钥。

枚举

Token

属性

  • id

    string

    Token 的唯一标识。

    静态 ID 为 "user""system",分别表示平台的用户专用硬件令牌和系统级硬件令牌。enterprise.platformKeys.getTokens 可能会返回任何其他令牌(带有其他标识符)。

  • softwareBackedSubtleCrypto

    SubtleCrypto

    Chrome 97 及更高版本

    实现 WebCrypto 的 SubtleCrypto 接口。加密操作(包括密钥生成)由软件支持。密钥的保护以及不可提取属性的实现是在软件中完成的,因此与硬件支持的密钥相比,密钥的保护力度较低。

    系统只能生成 modulusLength 不超过 2048 且不可提取的 RSASSA-PKCS1-V1_5 密钥。每个密钥最多只能用于一次数据签名。

    在特定 Token 上生成的密钥不能与任何其他令牌一起使用,也不能与 window.crypto.subtle 一起使用。同样,使用 window.crypto.subtle 创建的 Key 对象也不能与此接口一起使用。

  • subtleCrypto

    SubtleCrypto

    实现 WebCrypto 的 SubtleCrypto 接口。加密操作(包括密钥生成)由硬件支持。

    系统只能生成 modulusLength 不超过 2048 且不可提取的 RSASSA-PKCS1-V1_5 密钥以及 namedCurve P-256 的 ECDSA 密钥。每个密钥最多只能用于一次数据签名。

    在特定 Token 上生成的密钥不能与任何其他令牌一起使用,也不能与 window.crypto.subtle 一起使用。同样,使用 window.crypto.subtle 创建的 Key 对象也不能与此接口一起使用。

方法

challengeKey()

Chrome 110 及更高版本
chrome.enterprise.platformKeys.challengeKey(
  options: ChallengeKeyOptions,
  callback: function,
)

challengeMachineKeychallengeUserKey 类似,但允许指定已注册密钥的算法。质询由硬件支持的企业机器密钥,并作为远程认证协议的一部分发出响应。仅适用于 Chrome 操作系统,且与 Verified Access Web API(用于提出质询和验证回答)结合使用。

通过 Verified Access Web API 验证成功,可以明确表示当前设备是合法的 Chrome 操作系统设备,当前设备由验证时指定的网域管理,当前登录的用户由验证时指定的网域管理,并且当前设备状态符合企业设备政策。例如,政策可能会指定设备不得处于开发者模式。验证过程中发出的任何设备身份信息都与当前设备的硬件紧密绑定。如果指定了 "user" 范围,则身份也会严格绑定到当前登录的用户。

此函数受到严格限制,如果当前设备未受管理、当前用户未受管理或企业设备政策尚未明确为调用方启用此操作,此函数将失败。已质询的密钥不在 "system""user" 令牌中,并且无法通过任何其他 API 访问。

参数

  • 该对象包含 ChallengeKeyOptions 中定义的字段。

  • callback

    功能

    callback 参数的格式为:

    (response: ArrayBuffer) => void

    • 条回复

      ArrayBuffer

      质询响应。

challengeMachineKey()

Chrome 50 及更高版本 从 Chrome 110 开始弃用
chrome.enterprise.platformKeys.challengeMachineKey(
  challenge: ArrayBuffer,
  registerKey?: boolean,
  callback: function,
)

请改用 challengeKey

质询由硬件支持的企业机器密钥,并作为远程认证协议的一部分发出响应。仅适用于 Chrome 操作系统,且与 Verified Access Web API(用于提出质询和验证回答)结合使用。Verified Access Web API 验证成功,可以明确体现以下所有方面:* 当前设备是合法的 Chrome 操作系统设备。* 当前设备由验证期间指定的网域管理。* 当前登录的用户由验证期间指定的域管理。* 当前设备状态符合企业设备政策。例如,政策可能会指定设备不得处于开发者模式。* 通过验证发出的任何设备身份信息都与当前设备的硬件紧密关联。此函数受到严格限制,如果当前设备未受管理、当前用户未受管理或企业设备政策尚未明确为调用方启用此操作,此函数将失败。企业机器密钥不存储在 "system" 令牌中,并且任何其他 API 都无法访问该密钥。

参数

  • 质询

    ArrayBuffer

    Verified Access Web API 发出的质询。

  • registerKey

    布尔值(可选)

    Chrome 59 及更高版本

    如果设置此字段,系统会使用 "system" 令牌注册当前的企业机器密钥,并放弃企业机器密钥角色。然后,该密钥可与证书关联,并像使用其他签名密钥一样使用。此密钥是 2048 位 RSA。对此函数的后续调用会生成新的企业机器密钥。

  • callback

    功能

    callback 参数的格式为:

    (response: ArrayBuffer) => void

    • 条回复

      ArrayBuffer

      质询响应。

challengeUserKey()

Chrome 50 及更高版本 从 Chrome 110 开始弃用
chrome.enterprise.platformKeys.challengeUserKey(
  challenge: ArrayBuffer,
  registerKey: boolean,
  callback: function,
)

请改用 challengeKey

质询由硬件支持的企业用户密钥,并作为远程认证协议的一部分发出响应。仅适用于 Chrome 操作系统,且与 Verified Access Web API(用于提出质询和验证回答)结合使用。Verified Access Web API 验证成功,可以明确体现以下所有方面:* 当前设备是合法的 Chrome 操作系统设备。* 当前设备由验证期间指定的网域管理。* 当前登录的用户由验证期间指定的域管理。* 当前设备状态符合企业用户规范。例如,政策可能会指定设备不得处于开发者模式。* 验证过程发出的公钥与当前设备的硬件和当前登录的用户紧密绑定。此函数受到严格限制,如果当前设备未受管理、当前用户未受管理,或企业用户政策尚未明确允许调用方执行此操作,此函数将失败。企业用户密钥不位于 "user" 令牌中,并且无法通过任何其他 API 访问。

参数

  • 质询

    ArrayBuffer

    Verified Access Web API 发出的质询。

  • registerKey

    boolean

    如果设置了此字段,系统会使用 "user" 令牌注册当前的 Enterprise User Key 角色,并放弃 Enterprise User Key 角色。然后,该密钥可与证书关联,并像使用其他签名密钥一样使用。此密钥是 2048 位 RSA。对此函数的后续调用将生成新的企业用户密钥。

  • callback

    功能

    callback 参数的格式为:

    (response: ArrayBuffer) => void

    • 条回复

      ArrayBuffer

      质询响应。

getCertificates()

chrome.enterprise.platformKeys.getCertificates(
  tokenId: string,
  callback: function,
)

返回给定令牌提供的所有客户端证书的列表。可用于检查可用于特定身份验证的客户端证书是否存在以及是否过期。

参数

  • tokenId

    string

    getTokens 返回的令牌的 ID。

  • callback

    功能

    callback 参数的格式为:

    (certificates: ArrayBuffer[]) => void

    • certificates

      ArrayBuffer[]

      证书列表,每个证书均采用 X.509 证书的 DER 编码。

getTokens()

chrome.enterprise.platformKeys.getTokens(
  callback: function,
)

返回可用的令牌。在常规用户的会话中,该列表将始终包含具有 id "user" 的用户令牌。如果有可用的系统级 TPM 令牌,返回的列表还会包含具有 id "system" 的系统级令牌。该设备(对于 Chromebook 等设备)上的所有会话的系统级令牌都是相同的。

参数

  • callback

    功能

    callback 参数的格式为:

    (tokens: Token[]) => void

    • 词元

      可用令牌的列表。

importCertificate()

chrome.enterprise.platformKeys.importCertificate(
  tokenId: string,
  certificate: ArrayBuffer,
  callback?: function,
)

如果经过认证的密钥已存储在此令牌中,则将 certificate 导入指定的令牌。在认证请求成功后,此函数应该用于存储获取的证书,并使其可供操作系统和浏览器使用。

参数

  • tokenId

    string

    getTokens 返回的令牌的 ID。

  • 证书

    ArrayBuffer

    X.509 证书的 DER 编码。

  • callback

    函数(可选)

    callback 参数的格式为:

    () => void

removeCertificate()

chrome.enterprise.platformKeys.removeCertificate(
  tokenId: string,
  certificate: ArrayBuffer,
  callback?: function,
)

从给定令牌中移除 certificate(如果存在)。应用于移除过时的证书,以便在身份验证期间不会考虑这些证书,也不会使证书选择杂乱无章。应用于释放证书存储区中的存储空间。

参数

  • tokenId

    string

    getTokens 返回的令牌的 ID。

  • 证书

    ArrayBuffer

    X.509 证书的 DER 编码。

  • callback

    函数(可选)

    callback 参数的格式为:

    () => void