

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 CloudHSM CLI 管理仲裁身份验证（M of N 访问控制）
<a name="quorum-auth-chsm-cli"></a>

AWS CloudHSM 集群支持法定身份验证，也称为 M of N 访问控制。此功能要求 HSM 用户合作完成某些操作，从而增加了一层额外的保护。

对于仲裁身份验证，HSM 上的单个用户不能在 HSM 上执行仲裁控制型操作。必须有最少数量 (至少 2 个) 的 HSM 用户合作才能执行这些操作。

仲裁身份验证可以控制以下操作：
+ [管理员](understanding-users.md#admin) HSM 用户管理：创建和删除 HSM 用户，或者更改其他 HSM 用户的密码。有关更多信息，请参阅 [使用 AWS CloudHSM CloudHSM CLI 时启用了法定身份验证的用户管理](quorum-auth-chsm-cli-admin.md)。

 AWS CloudHSM中有关仲裁身份验证的要点。
+ HSM 用户可为自己的仲裁令牌签名，也就是说，提供仲裁身份验证所需的批准之一。
+ 您可以选择仲裁批准者的最小数量，介于二（2）到八（8）范围之内。
+ HSMs 最多可以存储 1024 个法定代币。达到此限制后，HSM 会清除过期的令牌以创建新令牌。
+ 默认情况下，令牌将在创建 10 分钟后过期。
+ 对于启用了 MFA 的集群，将使用同一密钥进行仲裁身份验证和多重身份验证（MFA）。有关更多信息，请参阅[使用 CloudHSM CLI 管理 MFA](login-mfa-token-sign.md)。
+ 针对每项管理服务，每个 HSM 可以包含一个令牌，针对每项加密用户服务，每个 HSM 可以包含多个令牌。

下列主题提供了有关 AWS CloudHSM中的仲裁身份验证的更多信息。

**Topics**
+ [

# CloudHSM CLI 的仲裁身份验证过程
](quorum-auth-chsm-cli-overview.md)
+ [

# 使用 CloudHSM CLI 进行法定身份验证支持的 AWS CloudHSM 服务名称和类型
](quorum-auth-chsm-cli-service-names.md)
+ [

# AWS CloudHSM 使用 CloudHSM CLI 为管理员设置法定身份验证
](quorum-auth-chsm-cli-first-time.md)
+ [

# 使用 AWS CloudHSM CloudHSM CLI 时启用了法定身份验证的用户管理
](quorum-auth-chsm-cli-admin.md)
+ [

# 更改使用 AWS CloudHSM CloudHSM CLI 时的最小法定人数值
](quorum-auth-chsm-cli-min-value.md)

# CloudHSM CLI 的仲裁身份验证过程
<a name="quorum-auth-chsm-cli-overview"></a>

以下步骤概括了 CloudHSM CLI 的仲裁身份验证过程。有关特定步骤和工具，请参阅[使用 AWS CloudHSM CloudHSM CLI 时启用了法定身份验证的用户管理](quorum-auth-chsm-cli-admin.md)。

1. 每个硬件安全模块（HSM）用户创建用于签名的非对称密钥。用户在 HSM 外部执行此操作，并注意适当地保护密钥。

1. 每个 HSM 用户都将登录 HSM 并向 HSM 注册其签名密钥的公有部分 (公有密钥)。

1. 当 HSM 用户要执行仲裁控制型操作时，同一用户将登录 HSM 并获取*仲裁令牌*。

1. HSM 用户将仲裁令牌提供给一个或多个其他 HSM 用户并请求其批准。

1. 其他 HSM 用户通过使用其密钥对仲裁令牌进行加密签名来进行批准。上述操作是在 HSM 外部进行的。

1. 当 HSM 用户获得所需数量的批准时，同一用户将登录 HSM 并使用 **--approval** 参数运行仲裁控制操作，提供包含所有必要批准（签名）的已签名仲裁令牌文件。

1. HSM 将使用每个签署人的已注册公有密钥来验证签名。如果签名有效，则 HSM 将批准该令牌并执行仲裁控制操作。

# 使用 CloudHSM CLI 进行法定身份验证支持的 AWS CloudHSM 服务名称和类型
<a name="quorum-auth-chsm-cli-service-names"></a>

**管理员服务**：仲裁身份验证用于管理员特权服务，例如创建用户、删除用户、更改用户密码、设置仲裁值以及停用仲裁和 MFA 功能。

**加密用户服务**：法定身份验证用于与特定密钥关联的加密用户特权服务，例如使用密钥、密钥、 sharing/unsharing 密钥进行签名以及设置密钥的属性。 wrapping/unwrapping 关联密钥的仲裁值是在生成、导入或解包密钥时配置的。仲裁值必须等于或小于与该密钥关联的用户数，其中包括与之共享密钥的用户和密钥所有者。

每个服务类型都进一步细分为限定服务名称，其中包含一组特定的、可执行的仲裁支持服务操作。


****  

| 服务名称 | 服务类型 | 服务操作 | 
| --- | --- | --- | 
| 用户 | Admin |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/quorum-auth-chsm-cli-service-names.html)  | 
| 仲裁 | Admin |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/quorum-auth-chsm-cli-service-names.html)  | 
| cluster1 | Admin |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/quorum-auth-chsm-cli-service-names.html)  | 
| 密钥管理 | 加密用户 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/quorum-auth-chsm-cli-service-names.html)  | 
| 密钥使用 | 加密用户 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/quorum-auth-chsm-cli-service-names.html)  | 

[1] 集群服务仅在 hsm2m.medium 上可用

# AWS CloudHSM 使用 CloudHSM CLI 为管理员设置法定身份验证
<a name="quorum-auth-chsm-cli-first-time"></a>

以下主题描述了配置硬件安全模块 (HSM) 以便 AWS CloudHSM [管理员](understanding-users.md#admin)可以使用法定身份验证时必须完成的步骤。当您首次为管理员配置仲裁身份验证时，只需执行下列步骤一次。完成这些步骤后，请参阅 [使用 AWS CloudHSM CloudHSM CLI 时启用了法定身份验证的用户管理](quorum-auth-chsm-cli-admin.md)。

**Topics**
+ [

## 先决条件
](#quorum-admin-prerequisites)
+ [

## 步骤 1：创建并注册签名密钥
](#quorum-admin-create-and-register-key)
+ [

## 步骤 2：在 HSM 上设置仲裁最小值
](#quorum-admin-set-quorum-minimum-value-chsm-cli)
+ [

## 仲裁最小值
](#cloudhsm_cli-qm-list-minimum)

## 先决条件
<a name="quorum-admin-prerequisites"></a>

要理解此示例，应熟悉 [CloudHSM CLI](cloudhsm_cli.md)。

## 步骤 1：创建并注册签名密钥
<a name="quorum-admin-create-and-register-key"></a>

要使用仲裁身份验证，每个管理员都必须完成以下*所有*操作：

**Topics**
+ [

### 创建 RSA 密钥对
](#mofn-key-pair-create-chsm-cli)
+ [

### 创建注册令牌并签名
](#mofn-registration-token-chsm-cli)
+ [

### 通过 HSM 注册公钥
](#mofn-register-key-chsm-cli)

### 创建 RSA 密钥对
<a name="mofn-key-pair-create-chsm-cli"></a>

创建和保护密钥对的方式有多种。以下示例说明如何使用 [OpenSSL](https://www.openssl.org/) 执行该操作。

**Example - 使用 OpenSSL 创建私有密钥**  
以下示例演示如何使用 OpenSSL 创建 2048 位 RSA 密钥。要使用此示例，请*<admin.key>*替换为要存储密钥的文件的名称。  

```
$ openssl genrsa -out <admin.key>
Generating RSA private key, 2048 bit long modulus
.....................................+++
.+++
e is 65537 (0x10001)
```

接下来，使用您刚刚创建的私钥生成公有密钥。

**Example - 使用 OpenSSL 创建公有密钥**  
以下示例演示如何使用 OpenSSL，根据您刚刚创建的私有密钥创建公钥。  

```
$ openssl rsa -in admin.key -outform PEM -pubout -out admin1.pub
writing RSA key
```

### 创建注册令牌并签名
<a name="mofn-registration-token-chsm-cli"></a>

创建一个令牌，并使用上一步生成的私有密钥签名。

**Example – 创建注册令牌**  

1. 使用以下命令启动 CloudHSM CLI。

------
#### [ Linux ]

   ```
   $ /opt/cloudhsm/bin/cloudhsm-cli interactive
   ```

------
#### [ Windows ]

   ```
   PS C:\> & "C:\Program Files\Amazon\CloudHSM\bin\cloudhsm-cli.exe" interactive
   ```

------

1. 通过运行[quorum token-sign generate](cloudhsm_cli-qm-token-gen.md)命令创建注册令牌：

   ```
   aws-cloudhsm > quorum token-sign generate --service registration --token /path/tokenfile
   {
     "error_code": 0,
     "data": {
       "path": "/path/tokenfile"
     }
   }
   ```

1. [quorum token-sign generate](cloudhsm_cli-qm-token-gen.md)命令在指定的文件路径上生成注册令牌。检查令牌文件：

   ```
   $ cat /path/tokenfile
   {
     "version": "2.0",
     "tokens": [
       {
         "approval_data": <approval data in base64 encoding>,
         "unsigned": <unsigned token in base64 encoding>,
         "signed": ""
       }
     ]
   }
   ```

   令牌路径包含以下内容：
   + **approval\$1data**：base64 编码的随机数据令牌，其原始数据最大不超过 245 字节。
   + **unsigned**：approval\$1data 的 base64 编码和 SHA256 哈希令牌。
   + **签名**：未签名令牌的 base64 编码签名令牌（签名），使用之前由 OpenSSL 生成的 RSA 2048 位私钥。

   您通过私钥对未签名令牌进行签名，以证明您有权访问私钥。您需要在注册令牌文件中完全填充签名和公钥，才能将管理员注册为集群的法定用户。 AWS CloudHSM 

**Example – 对未签名注册令牌签名**  

1. 解码 base64 编码的未签名令牌，并将其放入二进制文件：

   ```
   $ echo -n '6BMUj6mUjjko6ZLCEdzGlWpR5sILhFJfqhW1ej3Oq1g=' | base64 -d > admin.bin
   ```

1. 使用 OpenSSL 和私钥对当前未签名的二进制注册令牌签名，并创建二进制注册文件：

   ```
   $ openssl pkeyutl -sign \
   -inkey admin.key \
   -pkeyopt digest:sha256 \
   -keyform PEM \
   -in admin.bin \
   -out admin.sig.bin
   ```

1. 将二进制签名编码为 base64：

   ```
   $ base64 -w0 admin.sig.bin > admin.sig.b64
   ```

1. 将 base64 编码的签名复制并粘贴至令牌文件：

   ```
   {
     "version": "2.0",
     "tokens": [
       {
         "approval_data": <approval data in base64 encoding>,
         "unsigned": <unsigned token in base64 encoding>,
         "signed": <signed token in base64 encoding>
       }
     ]
   }
   ```

### 通过 HSM 注册公钥
<a name="mofn-register-key-chsm-cli"></a>

创建密钥后，管理员必须向 AWS CloudHSM 集群注册公钥。

**向 HSM 注册公有密钥**

1. 使用以下命令启动 CloudHSM CLI。

------
#### [ Linux ]

   ```
   $ /opt/cloudhsm/bin/cloudhsm-cli interactive
   ```

------
#### [ Windows ]

   ```
   PS C:\> & "C:\Program Files\Amazon\CloudHSM\bin\cloudhsm-cli.exe" interactive
   ```

------

1. 使用 CloudHSM CLI，以管理员身份登录。

   ```
   aws-cloudhsm > login --username <admin> --role admin
   Enter password:
   {
     "error_code": 0,
     "data": {
       "username": "<admin>",
       "role": "admin"
     }
   }
   ```

1. 使用 **[使用 CloudHSM CLI 注册用户的令牌签名仲裁策略](cloudhsm_cli-user-chqm-token-reg.md)** 命令注册公有密钥。有关更多信息，请参阅以下示例或使用 **help user change-quorum token-sign register** 命令。

**Example — 向集 AWS CloudHSM 群注册公钥**  
以下示例说明如何使用 CloudHSM CLI 中的 **user change-quorum token-sign register** 命令向 HSM 注册管理员的公有密钥。要使用此命令，管理员必须登录 HSM。将这些值替换为您自己的值：  

```
aws-cloudhsm > user change-quorum token-sign register --public-key </path/admin.pub> --signed-token </path/tokenfile>
{
  "error_code": 0,
  "data": {
    "username": "admin",
    "role": "admin"
  }
}
```
**/path/admin.pub**：公钥 PEM 文件的文件路径  
**是否必需**：是  
**/path/tokenfile**：用户私钥签名令牌的文件路径  
**是否必需**：是
在所有管理员注册其公钥后，**user list** 命令的输出将显示在仲裁字段中，表明启用仲裁策略，如下所示：  

```
aws-cloudhsm > user list
{
  "error_code": 0,
  "data": {
    "users": [
      {
        "username": "admin",
        "role": "admin",
        "locked": "false",
        "mfa": [],
        "quorum": [
          {
            "strategy": "token-sign",
            "status": "enabled"
          }
        ],
        "cluster-coverage": "full"
      },
      {
        "username": "admin2",
        "role": "admin",
        "locked": "false",
        "mfa": [],
        "quorum": [
          {
            "strategy": "token-sign",
            "status": "enabled"
          }
        ],
        "cluster-coverage": "full"
      },
      {
        "username": "admin3",
        "role": "admin",
        "locked": "false",
        "mfa": [],
        "quorum": [
          {
            "strategy": "token-sign",
            "status": "enabled"
          }
        ],
        "cluster-coverage": "full"
      },
      {
        "username": "admin4",
        "role": "admin",
        "locked": "false",
        "mfa": [],
        "quorum": [
          {
            "strategy": "token-sign",
            "status": "enabled"
          }
        ],
        "cluster-coverage": "full"
      },
      {
        "username": "app_user",
        "role": "internal(APPLIANCE_USER)",
        "locked": "false",
        "mfa": [],
        "quorum": [],
        "cluster-coverage": "full"
      }
    ]
  }
}
```
 在此示例中， AWS CloudHSM 集群有两个 HSMs，每个集群都有相同的管理员，如**user list**命令的以下输出所示。有关创建用户的更多信息，请参阅 [使用 CloudHSM CLI 进行用户管理](manage-hsm-users-chsm-cli.md)

## 步骤 2：在 HSM 上设置仲裁最小值
<a name="quorum-admin-set-quorum-minimum-value-chsm-cli"></a>

要使用仲裁身份验证，管理员必须登录 HSM，然后设置*仲裁最小值*。这是执行管理员用户管理操作所需的最少数量的 CO 审批。HSM 上的任何管理员 (包括尚未注册签名密钥的管理员) 都可设置仲裁最小值。您可以随时更改仲裁最小值。有关更多信息，请参阅 [更改最小值](quorum-auth-chsm-cli-min-value.md)。

**在 HSM 上设置仲裁最小值**

1. 使用以下命令启动 CloudHSM CLI。

------
#### [ Linux ]

   ```
   $ /opt/cloudhsm/bin/cloudhsm-cli interactive
   ```

------
#### [ Windows ]

   ```
   PS C:\> & "C:\Program Files\Amazon\CloudHSM\bin\cloudhsm-cli.exe" interactive
   ```

------

1. 使用 CloudHSM CLI，以管理员身份登录。

   ```
   aws-cloudhsm > login --username <admin> --role admin
   Enter password:
   {
     "error_code": 0,
     "data": {
       "username": "<admin>",
       "role": "admin"
     }
   }
   ```

1. 使用 **[使用 CloudHSM CLI 更新仲裁值](cloudhsm_cli-qm-token-set-qm.md)** 命令设置仲裁最小值。`--service` 标志用于标识您要为其设置值的 HSM 服务。有关更多信息，请参阅以下示例或使用 **help quorum token-sign set-quorum-value** 命令。

**Example - 在 HSM 上设置仲裁最小值**  
此示例使用仲裁最小值二 (2)。您可以选择介于二 (2) 到八 (8) 范围之内的任何值 (最多为 HSM 上的管理员总数量)。在此示例中，HSM 包含四 (4) 位管理员，因此可能的最大值为四 (4)。  
要使用以下示例命令，请将最后一个数字 (*<2>*) 替换为首选法定人数最小值。  

```
aws-cloudhsm > quorum token-sign set-quorum-value --service user --value <2>
{
  "error_code": 0,
  "data": "Set quorum value successful"
}
```
在此示例中，**[使用 CloudHSM CLI 显示仲裁值](cloudhsm_cli-qm-token-list-qm.md)** 命令列出了服务中包含的 HSM 服务类型、名称和描述。

## 仲裁最小值
<a name="cloudhsm_cli-qm-list-minimum"></a>

使用 **quorum token-sign list-quorum-values** 命令获取服务的仲裁最小值。

```
aws-cloudhsm > quorum token-sign list-quorum-values
{
  "error_code": 0,
  "data": {
    "user": 2,
    "quorum": 1
  }
}
```

来自前面的 **quorum token-sign list-quorum-values** 命令的输出显示，HSM 用户管理操作的仲裁最小值（负责用户管理操作）现在为二 (2)。完成这些步骤后，请参阅 [使用仲裁（M of N）进行用户管理](quorum-auth-chsm-cli-admin.md)。

**管理员服务**：仲裁身份验证用于管理员特权服务，例如创建用户、删除用户、更改用户密码、设置仲裁值以及停用仲裁和 MFA 功能。

**加密用户服务**：法定身份验证用于与特定密钥关联的加密用户特权服务，例如使用密钥、密钥、 sharing/unsharing 密钥进行签名以及设置密钥的属性。 wrapping/unwrapping 关联密钥的仲裁值是在生成、导入或解包密钥时配置的。仲裁值必须等于或小于与该密钥关联的用户数，其中包括与之共享密钥的用户和密钥所有者。

每个服务类型都进一步细分为限定服务名称，其中包含一组特定的、可执行的仲裁支持服务操作。


****  

| 服务名称 | 服务类型 | 服务操作 | 
| --- | --- | --- | 
| 用户 | Admin |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/quorum-auth-chsm-cli-first-time.html)  | 
| 仲裁 | Admin |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/quorum-auth-chsm-cli-first-time.html)  | 
| cluster1 | Admin |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/quorum-auth-chsm-cli-first-time.html)  | 
| 密钥管理 | 加密用户 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/quorum-auth-chsm-cli-first-time.html)  | 
| 密钥使用 | 加密用户 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/cloudhsm/latest/userguide/quorum-auth-chsm-cli-first-time.html)  | 

[1] 集群服务仅在 hsm2m.medium 上可用

# 使用 AWS CloudHSM CloudHSM CLI 时启用了法定身份验证的用户管理
<a name="quorum-auth-chsm-cli-admin"></a>

硬件安全模块 (HSM) 的 AWS CloudHSM [管理员](understanding-users.md#admin)可以为集群中的以下操作配置法定身份验证： AWS CloudHSM 
+ **[使用 CloudHSM CLI 创建 AWS CloudHSM 用户](cloudhsm_cli-user-create.md)**
+ **[使用 CloudHSM CLI 删除 AWS CloudHSM 用户](cloudhsm_cli-user-delete.md)**
+ **[使用 CloudHSM CLI 更改用户的密码](cloudhsm_cli-user-change-password.md)**
+ **[CloudHSM CLI 中的 user change-mfa 类别](cloudhsm_cli-user-change-mfa.md)**

 AWS CloudHSM 集群配置为法定身份验证后，管理员无法自行执行 HSM 用户管理操作。以下示例显示管理员尝试在 HSM 上创建新用户时的输出。该命令因出错而失败，指出需要进行仲裁身份验证。

```
aws-cloudhsm > user create --username user1 --role crypto-user
Enter password:
Confirm password:
{
  "error_code": 1,
  "data": "Quorum approval is required for this operation"
}
```

要执行 HSM 用户管理操作，管理员必须完成以下任务：

**Topics**
+ [

## 步骤 1：获取仲裁令牌
](#quorum-admin-gen-token-chsm-cli)
+ [

## 步骤 2：获得批准管理员的签名
](#quorum-admin-get-approval-signatures-chsm-cli)
+ [

## 步骤 3：在 AWS CloudHSM 集群上批准令牌并执行用户管理操作
](#quorum-admin-approve-token-chsm-cli)

## 步骤 1：获取仲裁令牌
<a name="quorum-admin-gen-token-chsm-cli"></a>

首先，管理员必须使用 CloudHSM CLI 申请*仲裁令牌*。

**获取仲裁令牌**

1. 使用以下命令启动 CloudHSM CLI。

------
#### [ Linux ]

   ```
   $ /opt/cloudhsm/bin/cloudhsm-cli interactive
   ```

------
#### [ Windows ]

   ```
   PS C:\> & "C:\Program Files\Amazon\CloudHSM\bin\cloudhsm-cli.exe" interactive
   ```

------

1. 使用 CloudHSM CLI，以管理员身份登录。

   ```
   aws-cloudhsm > login --username <admin> --role admin
   Enter password:
   {
     "error_code": 0,
     "data": {
       "username": "<admin>",
       "role": "admin"
     }
   }
   ```

1. 使用 **quorum token-sign generate** 命令获取仲裁令牌。有关更多信息，请参阅以下示例或使用 **help quorum token-sign generate** 命令。

**Example – 生成仲裁令牌**  
此示例将为用户名为 `admin` 的管理员获取一个仲裁令牌，并将该令牌保存到一个名为 `admin.token` 的文件中。要使用示例命令，可将这些值替换为您自己的值：  
+ *<admin>*— 获取令牌的管理员的姓名。这必须是已登录 HSM 并且正在运行此命令的管理员。
+ *<admin.token>*— 用于存储法定令牌的文件的名称。
在以下命令中，`user` 标识您可为之使用所生成之令牌的*服务名称*。在此示例中，令牌用于 HSM 用户管理操作 (`user` 服务)。  

```
aws-cloudhsm > login --username <admin> --role admin --password <password>
{
  "error_code": 0,
  "data": {
    "username": "<admin>",
    "role": "admin"
  }
}
```

```
aws-cloudhsm > quorum token-sign generate --service user --token </path/admin.token>
{
  "error_code": 0,
  "data": {
    "path": "/home/tfile"
  }
}
```
该 **quorum token-sign generate** 命令在指定的文件路径上生成用户服务仲裁令牌。可查看以下令牌文件：  

```
$ cat </path/admin.token>
{
  "version": "2.0",
  "service": "user-management",
  "approval_data": "AAEAAwAAABgAAAAAAAAAAJ9eFkfcP3mNzJAlfK+OWbNhZG1pbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABj5vbeAAAAAAAAAAAAAQADAAAAFQAAAAAAAAAAW/v5Euk83amq1fij0zyvD2FkbWluAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGPm9t4AAAAAAAAAAAABAAMAAAAUAAAAAAAAAABDw2XDwfK4hB8a15Xh1E0nYWRtaW4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY+b23gAAAAAAAAAA",
  "token": "0l2LZkmAHZyAc1hPhyckOoVW33aGrgG77qmDHWQ3CJ8=",
  "signatures": []
}
```
令牌路径包含以下内容：  
+ **service**：与令牌关联的仲裁服务的标识符。
+ **approval\$1data**：由 HSM 生成的 base64 编码原始数据令牌。
+ **令牌**：approval\$1data 的 base64 编码和 SHA-256 哈希令牌
+ **签名**：base64 编码签名令牌阵列，其中每个批准者签名均采用 JSON 对象常量形式：

  ```
  {
        "username": "<APPROVER_USERNAME>",
        "role": "<APPROVER_ROLE>",
        "signature": "<APPROVER_RSA2048_BIT_SIGNATURE>"
  }
  ```

  每个签名均由批准者使用相应的 RSA 2048 位私有密钥创建，其公有密钥通过 HSM 注册。
通过运行 **quorum token-sign list** 命令，确认 CloudHSM 集群中包含已生成用户服务仲裁令牌。  

```
aws-cloudhsm > quorum token-sign list
{
  "error_code": 0,
  "data": {
    "tokens": [
      {
        "username": "admin",
        "service": "user",
        "approvals-required": {
          "value": 2
        },
        "number-of-approvals": {
          "value": 0
        },
        "token-timeout-seconds": {
          "value": 597
        },
        "cluster-coverage": "full"
      }
    ]
  }
}
```
`token-timeout-seconds` 时间表示生成的令牌在过期之前获批的超时时间（以秒为单位）。

## 步骤 2：获得批准管理员的签名
<a name="quorum-admin-get-approval-signatures-chsm-cli"></a>

具有仲裁令牌的管理员必须获得其他管理员批准的令牌。为了提供其批准，其他管理员使用其签名密钥以加密方式对令牌进行签名。他们在 HSM 外部执行此操作。

可通过多种不同方式对令牌进行签名。以下示例说明如何使用 [OpenSSL](https://www.openssl.org/) 执行该操作。要使用其他签名工具，请确保该工具使用管理员的私有密钥 (签名密钥) 对令牌的 SHA-256 摘要进行签名。

**Example - 获得批准管理员的签名**  
在此示例中，具有令牌 (`admin`) 的管理员至少需要两 (2) 次批准。以下示例命令说明两 (2) 个管理员如何使用 OpenSSL 以加密方式对令牌进行签名。  

1. 解码 base64 编码的未签名令牌，并将其放入二进制文件：

   ```
   $ echo -n '0l2LZkmAHZyAc1hPhyckOoVW33aGrgG77qmDHWQ3CJ8=' | base64 -d > admin.bin
   ```

1. 使用 OpenSSL 和相应的批准者 `(admin3)` 私钥为当前未签名的二进制仲裁令牌签名，以获取用户服务和创建二进制签名文件：

   ```
   $ openssl pkeyutl -sign \
   -inkey admin3.key \
   -pkeyopt digest:sha256 \
   -keyform PEM \
   -in admin.bin \
   -out admin.sig.bin
   ```

1. 将二进制签名编码为 base64：

   ```
   $ base64 -w0 admin.sig.bin > admin.sig.b64
   ```

1. 最后，按此前批准者签名指定的 JSON 对象常量形式，将 base64 编码签名复制并粘贴至令牌文件。

   ```
   {
     "version": "2.0",
     "approval_data": "AAEAAwAAABgAAAAAAAAAAJ9eFkfcP3mNzJAlfK+OWbNhZG1pbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABj5vbeAAAAAAAAAAAAAQADAAAAFQAAAAAAAAAAW/v5Euk83amq1fij0zyvD2FkbWluAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGPm9t4AAAAAAAAAAAABAAMAAAAUAAAAAAAAAABDw2XDwfK4hB8a15Xh1E0nYWRtaW4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY+b23gAAAAAAAAAA",
     "token": "0l2LZkmAHZyAc1hPhyckOoVW33aGrgG77qmDHWQ3CJ8=",
     "signatures": [
       {
         "username": "admin2",
         "role": "admin",
         "signature": "O6qx7/mUaVkYYVr1PW7l8JJko+Kh3e8zBIqdk3tAiNy+1rW+OsDtvYujhEU4aOFVLcrUFmyB/CX9OQmgJLgx/pyK+ZPEH+GoJGqk9YZ7X1nOXwZRP9g7hKV+7XCtg9TuDFtHYWDpBfz2jWiu2fXfX4/jTs4f2xIfFPIDKcSP8fhxjQ63xEcCf1jzGha6rDQMu4xUWWdtDgfT7um7EJ9dXNoHqLB7cTzphaubNaEFbFPXQ1siGmYKmvETlqe/ssktwyruGFLpXs1n0tJOEglGhx2qbYTs+omKWZdORl5WIWEXW3IXw/Dg5vVObrNpvG0eZKO8nSMc27+cyPySc+ZbNw=="
       },
       {
         "username": "admin3",
         "role": "admin",
         "signature": "O6qx7/mUaVkYYVr1PW7l8JJko+Kh3e8zBIqdk3tAiNy+1rW+OsDtvYujhEU4aOFVLcrUFmyB/CX9OQmgJLgx/pyK+ZPEH+GoJGqk9YZ7X1nOXwZRP9g7hKV+7XCtg9TuDFtHYWDpBfz2jWiu2fXfX4/jTs4f2xIfFPIDKcSP8fhxjQ63xEcCf1jzGha6rDQMu4xUWWdtDgfT7um7EJ9dXNoHqLB7cTzphaubNaEFbFPXQ1siGmYKmvETlqe/ssktwyruGFLpXs1n0tJOEglGhx2qbYTs+omKWZdORl5WIWEXW3IXw/Dg5vVObrNpvG0eZKO8nSMc27+cyPySc+ZbNw=="
       }
     ]
   }
   ```

## 步骤 3：在 AWS CloudHSM 集群上批准令牌并执行用户管理操作
<a name="quorum-admin-approve-token-chsm-cli"></a>

管理员获得必要的批准/签名（如上一节所述）后，管理员可以向 AWS CloudHSM 集群提供该令牌，并执行以下用户管理操作之一：
+ **[创建](cloudhsm_cli-user-create.md)**
+ **[删除](cloudhsm_cli-user-delete.md)**
+ **[更改密码](cloudhsm_cli-user-change-password.md)**
+ **[user change-mfa](cloudhsm_cli-user-change-mfa.md)**

有关使用这些命令的更多信息，请参阅[使用 CloudHSM CLI 进行用户管理](manage-hsm-users-chsm-cli.md)。

在交易过程中，令牌将在 AWS CloudHSM 集群内获得批准并执行请求的用户管理操作。用户管理操作的成功取决于已批准的仲裁令牌和用户管理操作是否有效。

管理员只能将令牌用于一项操作。在该操作成功后，该令牌不再有效。若要执行其他 HSM 用户管理操作，管理员必须重复上述进程。那就是，管理员必须生成新的仲裁令牌、获取来自批准者的新签名，并按照所请求的用户管理操作批准和在 HSM 上使用新令牌。

**注意**  
仅当您当前登录会话打开时，仲裁令牌才有效。如果您登出 CloudHSM CLI 或者断开网络连接，则令牌将不再有效。同样，授权令牌只能用于 CloudHSM CLI 中。它无法用于在其他应用程序中进行身份验证。

**Example 以管理员身份创建新用户**  
在以下示例命令中，已登录管理员将在 HSM 上创建一个新用户：  

```
aws-cloudhsm > user create --username user1 --role crypto-user --approval /path/admin.token
Enter password:
Confirm password:
{
  "error_code": 0,
  "data": {
    "username": "user1",
    "role": "crypto-user"
  }
}
```
然后，管理员输入 **user list** 命令以确认创建新用户：  

```
aws-cloudhsm > user list
{
  "error_code": 0,
  "data": {
    "users": [
      {
        "username": "admin",
        "role": "admin",
        "locked": "false",
        "mfa": [],
        "quorum": [
          {
            "strategy": "token-sign",
            "status": "enabled"
          }
        ],
        "cluster-coverage": "full"
      },
      {
        "username": "admin2",
        "role": "admin",
        "locked": "false",
        "mfa": [],
        "quorum": [
          {
            "strategy": "token-sign",
            "status": "enabled"
          }
        ],
        "cluster-coverage": "full"
      },
      {
        "username": "admin3",
        "role": "admin",
        "locked": "false",
        "mfa": [],
        "quorum": [
          {
            "strategy": "token-sign",
            "status": "enabled"
          }
        ],
        "cluster-coverage": "full"
      },
      {
        "username": "admin4",
        "role": "admin",
        "locked": "false",
        "mfa": [],
        "quorum": [
          {
            "strategy": "token-sign",
            "status": "enabled"
          }
        ],
        "cluster-coverage": "full"
      },
      {
        "username": "user1",
        "role": "crypto-user",
        "locked": "false",
        "mfa": [],
        "quorum": [],
        "cluster-coverage": "full"
      },
      {
        "username": "app_user",
        "role": "internal(APPLIANCE_USER)",
        "locked": "false",
        "mfa": [],
        "quorum": [],
        "cluster-coverage": "full"
      }
    ]
  }
}
```
如果管理员尝试执行其他 HSM 用户管理操作，该操作将失败并出现仲裁身份验证错误：  

```
aws-cloudhsm > user delete --username user1 --role crypto-user
{
  "error_code": 1,
  "data": "Quorum approval is required for this operation"
}
```
如下所示，该 **quorum token-sign list** 命令显示管理员未批准令牌。若要执行其他 HSM 用户管理操作，管理员必须生成新的仲裁令牌，从批准者处获取新签名，然后使用 --approver 参数执行所需的用户管理操作，以提供待批准并在用户管理操作中使用的仲裁令牌。  

```
aws-cloudhsm > quorum token-sign list
{
  "error_code": 0,
  "data": {
    "tokens": []
  }
}
```

# 更改使用 AWS CloudHSM CloudHSM CLI 时的最小法定人数值
<a name="quorum-auth-chsm-cli-min-value"></a>

为 CloudHSM [管理员](understanding-users.md#admin)[设置仲裁最小值](quorum-auth-chsm-cli-first-time.md#quorum-admin-set-quorum-minimum-value-chsm-cli)后，可能需要调整仲裁最小值。仅当批准者数量达到或超过当前值时，HSM 才允许更改仲裁最小值。例如，仲裁最小值为二（2），则必须至少有两（2）个管理员批准任何更改。

**注意**  
用户服务的仲裁值必须小于或等于仲裁服务的仲裁值。有关服务名称的信息，请参阅 [使用 CloudHSM CLI 进行法定身份验证支持的 AWS CloudHSM 服务名称和类型](quorum-auth-chsm-cli-service-names.md)。

要获取更改仲裁最小值的仲裁批准，您需要一个使用 **quorum token-sign set-quorum-value** 命令用于 **quorum service** 的*仲裁令牌*。若要使用 **quorum token-sign set-quorum-value** 命令为 **quorum service** 生成仲裁令牌，仲裁服务值必须大于一 (1)。这意味着，您可能需要先更改*用户服务*的仲裁最小值，然后才能更改*仲裁服务*的仲裁最小值。

**更改管理员的仲裁最小值的步骤**

1. 启动 CloudHSM CLI 交互模式。

------
#### [ Linux ]

   ```
   $ /opt/cloudhsm/bin/cloudhsm-cli interactive
   ```

------
#### [ Windows ]

   ```
   PS C:\> & "C:\Program Files\Amazon\CloudHSM\bin\cloudhsm-cli.exe" interactive
   ```

------

1. 使用 CloudHSM CLI，以管理员身份登录。

   ```
   aws-cloudhsm > login --username <admin> --role admin
   Enter password:
   {
     "error_code": 0,
     "data": {
       "username": "<admin>",
       "role": "admin"
     }
   }
   ```

1. 检查当前的仲裁最小值：

   ```
   aws-cloudhsm > quorum token-sign list-quorum-values
   ```

1. 如果仲裁服务的仲裁最小值小于用户服务的相应值，请更改*仲裁服务*值：

   ```
   aws-cloudhsm > quorum token-sign set-quorum-value --service quorum --value <3>
   ```

1. 为仲裁服务[生成仲裁令牌](quorum-auth-chsm-cli-admin.md#quorum-admin-gen-token-chsm-cli)。

1. [获得其他管理员的批准 (签名)](quorum-auth-chsm-cli-admin.md#quorum-admin-get-approval-signatures-chsm-cli)。

1. [批准 CloudHSM 集群上的令牌，执行用户管理操作](quorum-auth-chsm-cli-admin.md#quorum-admin-approve-token-chsm-cli)。

1. 更改*用户服务*的仲裁最小值：

   ```
   aws-cloudhsm > quorum token-sign set-quorum-value
   ```

**Example 调整*仲裁服务*最小值**  

1. **检查当前值**。示例显示了*用户服务*的仲裁最小值当前为二（2）。

   ```
   aws-cloudhsm > quorum token-sign list-quorum-values
   {
     "error_code": 0,
     "data": {
       "user": 2,
       "quorum": 1
     }
   }
   ```

1. **更改仲裁服务值**。将*仲裁服务*的仲裁最小值设置为等于或大于*用户服务*的相应值的值。本示例将*仲裁服务*的仲裁最小值设置为二（2），与上一示例中为*用户服务*设置的值相同。

   ```
   aws-cloudhsm > quorum token-sign set-quorum-value --service quorum --value 2
   {
     "error_code": 0,
     "data": "Set quorum value successful"
   }
   ```

1. **验证更改**。本示例显示了*用户服务*和*仲裁服务*的仲裁最小值现在为二（2）。

   ```
   aws-cloudhsm > quorum token-sign list-quorum-values
   {
     "error_code": 0,
     "data": {
       "user": 2,
       "quorum": 2
     }
   }
   ```