browser.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()`[3] 导入

以下示例展示了主要的 API 交互(不包括构建和发送认证请求):

function getUserToken(callback) {
  browser.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) {
  browser.enterprise.platformKeys.importCertificate(userToken.id, certificate);
}

getUserToken(generateAndSign);

类型

Algorithm

Chrome 110+ browser.*(自 Chrome 148 起)

要生成的密钥类型。

枚举

"RSA"

"ECDSA"

ChallengeKeyOptions

Chrome 110+ browser.*(自 Chrome 148 起)

属性

  • 挑战

    ArrayBuffer

    Verified Access Web API 发出的质询。

  • registerKey

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

  • 范围

    要验证哪个企业密钥。

RegisterKeyOptions

Chrome 110+ browser.*(自 Chrome 148 起)

属性

  • 算法

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

Scope

Chrome 110+ browser.*(自 Chrome 148 起)

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

枚举

"USER"

"MACHINE"

Token

属性

  • id

    字符串

    此 Token 的唯一标识符。

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

  • softwareBackedSubtleCrypto

    SubtleCrypto

    Chrome 97 及更高版本 自 Chrome 148 起为 browser.*

    实现 WebCrypto 的 SubtleCrypto 接口。加密操作(包括密钥生成)由软件支持。密钥的保护以及不可提取属性的实现均通过软件完成,因此这些密钥的保护程度低于由硬件支持的密钥。

    只能生成不可提取的密钥。唯一支持的密钥类型是 RSASSA-PKCS1-V1_5,modulusLength 最大为 2048。每个密钥最多只能用于对数据进行一次签名,除非该扩展程序已通过 KeyPermissions 政策列入许可清单,在这种情况下,该密钥可以无限期使用。

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

  • subtleCrypto

    SubtleCrypto

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

    只能生成不可提取的密钥。支持的密钥类型包括 RSASSA-PKCS1-V1_5(modulusLength 最高 2048)和 ECDSA(namedCurve P-256)。每个密钥最多只能用于对数据进行一次签名,除非该扩展程序已列入 KeyPermissions 政策的许可清单,在这种情况下,该密钥可以无限期使用。

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

方法

challengeKey()

Chrome 110+ browser.*(自 Chrome 148 起)
browser.enterprise.platformKeys.challengeKey(
  options: ChallengeKeyOptions,
)
: Promise<ArrayBuffer>

与 challengeMachineKey 和 challengeUserKey 类似,但允许指定已注册密钥的算法。质询由硬件支持的企业机器密钥,并发出响应作为远程证明协议的一部分。仅在 ChromeOS 上有用,且需与 Verified Access Web API 结合使用,后者既会发出质询,也会验证响应。

如果 Verified Access Web API 验证成功,则表明当前设备是合法的 ChromeOS 设备,当前设备由验证期间指定的网域管理,当前登录的用户由验证期间指定的网域管理,并且当前设备状态符合企业设备政策。例如,某项政策可能会指定设备不得处于开发者模式。验证发出的任何设备标识都与当前设备的硬件紧密绑定。如果指定了 "user" 范围,则该身份也会与当前登录的用户紧密绑定。

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

参数

返回

  • Promise<ArrayBuffer>

    Chrome 131 及更高版本 browser.*(自 Chrome 148 起)

    返回一个 Promise,该 Promise 会通过质询响应进行解析。

challengeMachineKey()

Chrome 50 及更高版本 browser.*(自 Chrome 148 起) 自 Chrome 110 起已弃用
browser.enterprise.platformKeys.challengeMachineKey(
  challenge: ArrayBuffer,
  registerKey?: boolean,
)
: Promise<ArrayBuffer>

请改用 challengeKey。

对硬件支持的企业机器密钥进行质询,并发出响应作为远程证明协议的一部分。仅在 ChromeOS 上有用,且需与 Verified Access Web API 结合使用,后者既会发出质询,也会验证响应。如果 Verified Access Web API 验证成功,则强烈表明以下所有情况:* 当前设备是合法的 ChromeOS 设备。* 当前设备由验证期间指定的网域管理。* 当前登录的用户由验证期间指定的网域管理。* 当前设备状态符合企业设备政策。例如,某项政策可能会指定设备不得处于开发者模式。* 验证发出的任何设备标识都与当前设备的硬件紧密绑定。此功能受到严格限制,如果当前设备不受管理、当前用户不受管理,或者企业设备政策未明确为调用方启用此操作,则此功能将失败。企业机器密钥不位于 "system" 令牌中,任何其他 API 都无法访问。

参数

  • 挑战

    ArrayBuffer

    Verified Access Web API 发出的质询。

  • registerKey

    布尔值 (可选)

    Chrome 59 及更高版本 自 Chrome 148 起为 browser.*

    如果设置了此政策,当前企业机器密钥会注册到 "system" 令牌,并放弃企业机器密钥角色。然后,该密钥可以与证书相关联,并像任何其他签名密钥一样使用。此密钥为 2048 位 RSA 密钥。随后,对此函数的后续调用将生成新的企业机器密钥。

返回

  • Promise<ArrayBuffer>

    Chrome 131 及更高版本 browser.*(自 Chrome 148 起)

    返回一个 Promise,该 Promise 会通过质询响应进行解析。

challengeUserKey()

Chrome 50 及更高版本 browser.*(自 Chrome 148 起) 自 Chrome 110 起已弃用
browser.enterprise.platformKeys.challengeUserKey(
  challenge: ArrayBuffer,
  registerKey: boolean,
)
: Promise<ArrayBuffer>

请改用 challengeKey。

质询由硬件支持的企业用户密钥,并发出响应作为远程证明协议的一部分。仅在 ChromeOS 上有用,且需与 Verified Access Web API 结合使用,后者既会发出质询,也会验证响应。如果 Verified Access Web API 验证成功,则强烈表明以下所有情况:* 当前设备是合法的 ChromeOS 设备。* 当前设备由验证期间指定的网域管理。* 当前登录的用户由验证期间指定的网域管理。* 当前设备状态符合企业用户政策。例如,某项政策可能会指定设备不得处于开发者模式。* 验证发出的公钥与当前设备的硬件以及当前登录的用户紧密绑定。此功能受到严格限制,如果当前设备不受管理、当前用户不受管理,或者企业用户政策未明确为调用方启用此操作,则此功能将失败。企业用户密钥不位于 "user" 令牌中,也无法通过任何其他 API 访问。

参数

  • 挑战

    ArrayBuffer

    Verified Access Web API 发出的质询。

  • registerKey

    布尔值

    如果设置了此政策,当前企业用户密钥会注册到 "user" 令牌,并放弃企业用户密钥角色。然后,该密钥可以与证书相关联,并像任何其他签名密钥一样使用。此密钥为 2048 位 RSA 密钥。随后调用此函数将生成新的企业用户密钥。

返回

  • Promise<ArrayBuffer>

    Chrome 131 及更高版本 browser.*(自 Chrome 148 起)

    返回一个 Promise,该 Promise 会通过质询响应进行解析。

getCertificates()

browser.enterprise.platformKeys.getCertificates(
  tokenId: string,
)
: Promise<ArrayBuffer[]>

返回指定令牌中可用的所有客户端证书的列表。可用于检查是否存在可用于特定身份验证的客户端证书,以及这些证书是否已过期。

参数

  • tokenId

    字符串

    getTokens 返回的令牌 ID。

返回

  • Promise<ArrayBuffer[]>

    Chrome 131 及更高版本 browser.*(自 Chrome 148 起)

    返回一个 Promise,该 Promise 会解析为可用证书列表。

getTokens()

browser.enterprise.platformKeys.getTokens(): Promise<Token[]>

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

返回

  • Promise<Token[]>

    Chrome 131 及更高版本 browser.*(自 Chrome 148 起)

    由 getTokens 调用,并提供可用令牌的列表。

importCertificate()

browser.enterprise.platformKeys.importCertificate(
  tokenId: string,
  certificate: ArrayBuffer,
)
: Promise<void>

如果认证密钥已存储在此令牌中,则将 certificate 导入到给定令牌。成功发出认证请求后,应使用此函数来存储获取的证书,并将其提供给操作系统和浏览器进行身份验证。

参数

  • tokenId

    字符串

    getTokens 返回的令牌 ID。

  • 证书

    ArrayBuffer

    X.509 证书的 DER 编码。

返回

  • 承诺<void>

    Chrome 131 及更高版本 browser.*(自 Chrome 148 起)

    返回一个 Promise,该 Promise 会在此操作完成时解析。

removeCertificate()

browser.enterprise.platformKeys.removeCertificate(
  tokenId: string,
  certificate: ArrayBuffer,
)
: Promise<void>

从给定令牌中移除 certificate(如果存在)。应使用此选项移除过时的证书,以免在身份验证期间考虑这些证书,并避免证书选择混乱。应在证书存储区中释放存储空间。

参数

  • tokenId

    字符串

    getTokens 返回的令牌 ID。

  • 证书

    ArrayBuffer

    X.509 证书的 DER 编码。

返回

  • 承诺<void>

    Chrome 131 及更高版本 browser.*(自 Chrome 148 起)

    返回一个 Promise,该 Promise 会在此操作完成时解析。