

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

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

 AWS CloudHSM 集群中的硬件安全模块 (HSMs) 支持法定身份验证，也称为 M of N 访问控制。对于仲裁身份验证，HSM 上的单个用户不能执行仲裁控制型操作。必须有最少数量 (至少 2 个) 的 HSM 用户合作才能执行这些操作。仲裁身份验证通过要求多个 HSM 用户批准增加一层额外的保护。

仲裁身份验证可以控制以下操作：
+ [加密用户](understanding-users.md#crypto-user-chsm-cli)的 HSM 密钥使用和管理：使用密钥创建签名，或者包装、解包、共享、取消共享和设置密钥的属性。

**重要注意事项**
+ HSM 用户可为自己的仲裁令牌签名，也就是说，请求用户可提供仲裁身份验证所需的批准之一。
+ 为仲裁控制型操作选择最小数量的仲裁审批者。您可以选择的最小数字是二（2），您可以选择的最大数字是八（8）。
+ HSM 最多可以存储 1,024 个法定代币。如果您尝试创建新令牌时，HSM 已有 1,024 个令牌，则 HSM 会清除其中一个过期的令牌。默认情况下，令牌将在创建 10 分钟后过期。
+ 如果启用了多重身份验证（MFA），则集群将使用同一密钥进行仲裁身份验证和 MFA。有关使用仲裁身份验证和 MFA 的更多信息，请参阅[使用 CloudHSM CLI 管理 MFA](login-mfa-token-sign.md)。
+ 针对每项管理服务，每个 HSM 一次只能包含一个令牌，但针对每项加密用户服务，每个 HSM 一次可以包含多个令牌。

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

**Topics**
+ [CloudHSM CLI 的仲裁身份验证过程](key-quorum-auth-chsm-cli-overview.md)
+ [使用 CloudHSM CLI 进行法定身份验证支持的 AWS CloudHSM 服务名称和类型](key-quorum-auth-chsm-cli-service-names.md)
+ [使用 CloudHSM CLI 为 AWS CloudHSM 加密用户设置法定身份验证](key-quorum-auth-chsm-cli-first-time.md)
+ [使用 AWS CloudHSM CloudHSM CLI 时启用法定身份验证的密钥管理和使用](key-quorum-auth-chsm-cli-crypto-user.md)

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

以下步骤概括了 CloudHSM CLI 的仲裁身份验证过程。有关特定步骤和工具，请参阅[使用 AWS CloudHSM CloudHSM CLI 时启用法定身份验证的密钥管理和使用](key-quorum-auth-chsm-cli-crypto-user.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="key-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/key-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/key-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/key-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/key-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/key-quorum-auth-chsm-cli-service-names.html)  | 

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

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

这些主题描述如何配置您的 CloudHSM，进而实现[加密用户](understanding-users.md#crypto-user-chsm-cli)的仲裁身份验证。在初始设置期间执行一次这些步骤。有关后续密钥管理和使用的信息，请参阅[使用 AWS CloudHSM CloudHSM CLI 时启用法定身份验证的密钥管理和使用](key-quorum-auth-chsm-cli-crypto-user.md)。

**Topics**
+ [先决条件](#key-quorum-crypto-user-prerequisites)
+ [步骤 1：创建并注册签名密钥](#key-quorum-crypto-user-create-and-register-key)
+ [步骤 2：在密钥生成过程中设置密钥仲裁值](#key-quorum-admin-set-quorum-minimum-value-chsm-cli)

## 先决条件
<a name="key-quorum-crypto-user-prerequisites"></a>
+ 熟悉 [CloudHSM CLI](cloudhsm_cli.md)

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

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

**Topics**
+ [创建 RSA 密钥对](#key-mofn-key-pair-create-chsm-cli)
+ [创建注册令牌](#key-mofn-registration-token-chsm-cli)
+ [对未签名注册令牌签名](#key-mofn-sign-registration-token-chsm-cli)
+ [通过 HSM 注册公钥](#key-mofn-register-key-chsm-cli)

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

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

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

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

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

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

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

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

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

**创建注册令牌**

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 字节。
   + **未签名：ap** proval\$1data 的 base64 编码和 SHA256 哈希令牌。
   + **签名**：未签名令牌的 base64 编码签名令牌（签名），使用之前由 OpenSSL 生成的 RSA 2048 位私钥。

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

### 对未签名注册令牌签名
<a name="key-mofn-sign-registration-token-chsm-cli"></a>

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

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

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

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

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

   ```
   $ base64 -w0 crypto_user.sig.bin > crypto_user.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="key-mofn-register-key-chsm-cli"></a>

创建密钥后，加密用户必须向集群注册公钥。 AWS CloudHSM 

1. 启动 CloudHSM CLI：

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

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

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

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

------

1. 以您要注册其公有密钥的加密用户身份登录。

   ```
   aws-cloudhsm > login --username crypto_user1 --role crypto-user
   Enter password:
   {
     "error_code": 0,
     "data": {
       "username": "crypto_user1",
       "role": "crypto-user"
     }
   }
   ```

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/crypto_user.pub> --signed-token </path/tokenfile>
   {
     "error_code": 0,
     "data": {
       "username": "crypto_user1",
       "role": "crypto-user"
     }
   }
   ```
**注意**  
**/path/crypto\$1user.pub**：公有密钥 PEM 文件的文件路径  
**是否必需**：是  
**/path/token\$1file**：用户私有密钥签名令牌的文件路径  
**是否必需**：是

1. 在所有加密用户注册其公有密钥后，**user list** 命令的输出将显示在仲裁字段中，表明正在使用已启用的仲裁策略。

    在此示例中， AWS CloudHSM 集群有两个 HSMs，每个集群都有相同的加密用户，如命令的以下输出所**user list**示。有关创建用户的更多信息，请参见 [使用 CloudHSM CLI 进行用户管理](manage-hsm-users-chsm-cli.md)。

   ```
   aws-cloudhsm > user list
   {
     "error_code": 0,
     "data": {
       "users": [
         {
           "username": "admin",
           "role": "admin",
           "locked": "false",
           "mfa": [],
           "quorum": [],
           "cluster-coverage": "full"
         },
         {
           "username": "crypto_user1",
           "role": "crypto-user",
           "locked": "false",
           "mfa": [],
           "quorum": [
             {
               "strategy": "token-sign",
               "status": "enabled"
             }
           ],
           "cluster-coverage": "full"
         },
         {
           "username": "crypto_user2",
           "role": "crypto-user",
           "locked": "false",
           "mfa": [],
           "quorum": [
             {
               "strategy": "token-sign",
               "status": "enabled"
             }
           ],
           "cluster-coverage": "full"
         },
         {
           "username": "crypto_user3",
           "role": "crypto-user",
           "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"
         }
       ]
     }
   }
   ```

## 步骤 2：在密钥生成过程中设置密钥仲裁值
<a name="key-quorum-admin-set-quorum-minimum-value-chsm-cli"></a>

要使用仲裁身份验证，加密用户必须登录 HSM，然后设置关联的*密钥仲裁值*。这是执行 HSM 密钥操作所需的最低加密用户批准数量。 management/usage 有关与密钥管理或密钥使用关联的关联密钥命令的更多信息，请参阅 [支持的服务和类型](key-quorum-auth-chsm-cli-service-names.md)。

**生成设置了密钥仲裁值的密钥对**

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 crypto_user1 --role crypto-user
   Enter password:
   {
     "error_code": 0,
     "data": {
       "username": "crypto_user1",
       "role": "crypto-user"
     }
   }
   ```

此示例生成一个 RSA 密钥对，该密钥对的密钥管理和密钥使用操作均设置为两（2）个密钥仲裁值。您可以选择介于零（0）到八（8）范围之内的任何值，最多为 HSM 上的加密用户总数。在此示例中，HSM 具有三（3）位加密用户，因此最大可取值为三（3）。请注意，在本示例中，我们在密钥生成*<crypto\$1user2>*过程中与之共享密钥。另请注意，公有密钥没有仲裁值。

```
aws-cloudhsm > key generate-asymmetric-pair rsa \
--public-exponent 65537 \
--modulus-size-bits 2048 \
--public-label rsa-public-key-example \
--private-label rsa-private-key-example \
--public-attributes verify=true \
--private-attributes sign=true
--share-crypto-users crypto_user2 \
--manage-private-key-quorum-value 2 \
--use-private-key-quorum-value 2
{
  "error_code": 0,
  "data": {
    "public_key": {
      "key-reference": "0x0000000000640006",
      "key-info": {
        "key-owners": [
          {
            "username": "crypto_user",
            "key-coverage": "full"
          }
        ],
        "shared-users": [],
        "key-quorum-values": {
          "manage-key-quorum-value": 0,
          "use-key-quorum-value": 0
        },
        "cluster-coverage": "full"
      },
      "attributes": {
        "key-type": "rsa",
        "label": "rsa-public-key-example",
        "id": "0x",
        "check-value": "0x218f50",
        "class": "public-key",
        "encrypt": false,
        "decrypt": false,
        "token": true,
        "always-sensitive": false,
        "derive": false,
        "destroyable": true,
        "extractable": true,
        "local": true,
        "modifiable": true,
        "never-extractable": false,
        "private": true,
        "sensitive": false,
        "sign": false,
        "trusted": false,
        "unwrap": false,
        "verify": true,
        "wrap": false,
        "wrap-with-trusted": false,
        "key-length-bytes": 512,
        "public-exponent": "0x010001",
        "modulus": "0xbdf471a3d2a869492f51c767bece8780730ae6479a9a75efffe7cea3594fb28ca518630e7b1d988b45d2fedc830b7ab848448c24c476cacb73d1523278aed289551e07af0fbfabe4811cc4601678bd097b5c0a578249ed1eb0e4878a80ba1ed85ac46eb1fee60d2a8bdd322075196dec4b57fa2cd82af44ad068115ac219bc073ec65c19c97bd883cf26931408d7bc51e237626b8b9b8f2485425907a0eb42f2f4c40018c8dac7ceeb1b646305a2e537ab904346883e41d568264abee0137048e4657d2cf72801810f3212f662b7a7ae134848b922771f6a30aa76718008d9cc74ff8ddcd8d867b05c3d40020d1514999af96889911467191b9f390d8de07f83",
        "modulus-size-bits": 2048
      }
    },
    "private_key": {
      "key-reference": "0x0000000000640007",
      "key-info": {
        "key-owners": [
          {
            "username": "crypto_user",
            "key-coverage": "full"
          }
        ],
        "shared-users": [
          {
            "username": "crypto_user2",
            "key-coverage": "full"
          }
        ],
        "key-quorum-values": {
          "manage-key-quorum-value": 2,
          "use-key-quorum-value": 2
        },
        "cluster-coverage": "full"
      },
      "attributes": {
        "key-type": "rsa",
        "label": "rsa-private-key-example",
        "id": "0x",
        "check-value": "0x218f50",
        "class": "private-key",
        "encrypt": false,
        "decrypt": false,
        "token": true,
        "always-sensitive": true,
        "derive": false,
        "destroyable": true,
        "extractable": true,
        "local": true,
        "modifiable": true,
        "never-extractable": false,
        "private": true,
        "sensitive": true,
        "sign": true,
        "trusted": false,
        "unwrap": false,
        "verify": false,
        "wrap": false,
        "wrap-with-trusted": false,
        "key-length-bytes": 1216,
        "public-exponent": "0x010001",
        "modulus": "0xbdf471a3d2a869492f51c767bece8780730ae6479a9a75efffe7cea3594fb28ca518630e7b1d988b45d2fedc830b7ab848448c24c476cacb73d1523278aed289551e07af0fbfabe4811cc4601678bd097b5c0a578249ed1eb0e4878a80ba1ed85ac46eb1fee60d2a8bdd322075196dec4b57fa2cd82af44ad068115ac219bc073ec65c19c97bd883cf26931408d7bc51e237626b8b9b8f2485425907a0eb42f2f4c40018c8dac7ceeb1b646305a2e537ab904346883e41d568264abee0137048e4657d2cf72801810f3212f662b7a7ae134848b922771f6a30aa76718008d9cc74ff8ddcd8d867b05c3d40020d1514999af96889911467191b9f390d8de07f83",
        "modulus-size-bits": 2048
      }
    }
  }
}
```

生成带有仲裁控制的密钥时，该密钥必须与等于最大密钥仲裁值的最小用户数相关联。关联用户包括密钥所有者和与其共享密钥的加密用户。要确定与之共享密钥的最小用户数，请获取密钥使用仲裁值和密钥管理仲裁值之间的最大仲裁值，然后减去 1 以说明密钥所有者（默认情况下与密钥相关联）。要与更多用户共享密钥，请使用 **[使用 CloudHSM CLI 共享密钥](cloudhsm_cli-key-share.md)** 命令。

在生成密钥时未能与足够多的用户共享密钥将导致失败，如下所示。

```
aws-cloudhsm > key generate-asymmetric-pair rsa \
--public-exponent 65537 \
--modulus-size-bits 2048 \
--public-label rsa-public-key-example \
--private-label rsa-private-key-example \
--public-attributes verify=true \
--private-attributes sign=true
--share-crypto-users crypto_user2 crypto_user3 \
--manage-private-key-quorum-value 3 \
--use-private-key-quorum-value 4
{
  "error_code": 1,
  "data": "Invalid quorum value provided."
}
```

# 使用 AWS CloudHSM CloudHSM CLI 时启用法定身份验证的密钥管理和使用
<a name="key-quorum-auth-chsm-cli-crypto-user"></a>

为 AWS CloudHSM 集群配置法定身份验证后，如果加密用户的密钥具有关联的法定值，则他们无法自行执行 HSM 密钥管理或使用操作。本主题说明加密用户如何获取临时令牌来执行 HSM 密钥管理或密钥使用操作。

**注意**  
每个仲裁令牌对一个操作有效。该操作成功后，令牌将不再有效，加密用户必须获取新令牌。仲裁令牌仅在您当前登录会话期间有效。如果您登出 CloudHSM CLI 或者断开网络连接，则令牌将不再有效，您需要获取新令牌。您只能在 CloudHSM CLI 中使用 CloudHSM 令牌。您无法将其用于在其他应用程序中进行身份验证。

以下示例显示了配置仲裁身份验证后，加密用户尝试在 HSM 上使用仲裁关联密钥创建签名时的输出。该命令失败，并出现 `Quorum Failed` 错误，这表示仲裁身份验证失败：

```
aws-cloudhsm > crypto sign rsa-pkcs --key-filter attr.label=rsa-private-key-example --hash-function sha256 --data YWJjMTIz
{
  "error_code": 1,
  "data": "Quorum Failed"
}
```

加密用户必须完成以下任务才能获得用于在 HSM 上执行密钥管理或密钥使用操作的临时令牌：

**Topics**
+ [步骤 1：获取仲裁令牌](#key-quorum-admin-gen-token-chsm-cli)
+ [步骤 2：获得批准加密用户的签名](#key-quorum-crypto-user-get-approval-signatures-chsm-cli)
+ [步骤 3：在 CloudHSM; 集群上批准令牌并执行操作](#key-quorum-crypto-user-approve-token-chsm-cli)

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

1. 启动 CloudHSM CLI。

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

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

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

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

------

1. 以加密用户身份登录集群。

   ```
   aws-cloudhsm > login --username <crypto_user1> --role crypto-user --password password123
   ```

   此示例使用 `crypto-user` 角色将 `crypto_user1` 登录 CloudHSM CLI。将这些值替换为您自己的值。

   ```
   {
     "error_code": 0,
     "data": {
       "username": "crypto_user1",
       "role": "crypto-user"
     }
   }
   ```

1. 使用 **quorum token-sign generate** 命令生成仲裁令牌。

   在以下命令中，`key-usage` 标识您将在其中使用所生成之令牌的*服务名称*。在这种情况下，令牌用于密钥使用操作（`key-usage` 服务）。此示例使用 `--filter` 标志将令牌与特定密钥相关联。

   ```
   aws-cloudhsm > quorum token-sign generate --service key-usage --token </path/crypto_user1.token> --filter attr.label=rsa-private-key-example
   {
     "error_code": 0,
     "data": {
       "path": "/home/crypto_user1.token"
     }
   }
   ```

   此示例将为用户名为 `crypto_user1` 的加密用户获取一个仲裁令牌，并将该令牌保存到一个名为 `crypto_user1.token` 的文件中。要使用示例命令，可将这些值替换为您自己的值：

   **quorum token-sign generate** 命令在指定的文件路径上生成密钥使用服务仲裁令牌。可以查看以下令牌文件：

   ```
   $ cat </path/crypto_user1.token>
   {
     "version": "2.0",
     "service": "key-usage",
     "key_reference": "0x0000000000680006",
     "approval_data": "AAIABQAAABkAAAAAAGgABi5CDa9x9VyyRIaFbkSrHgJjcnlwdG9fdXNlcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnPQBLAAAAAAAAAAAAAgAFAAAAGgAAAAAAaAAGQvd2qKY+GJj8gXo9lKuANGNyeXB0b191c2VyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGc9AEsAAAAAAAAAAA==",
     "token": "5GlgoWOlQU4fw4QIlbxkPGZVOVoDugFGuSKE/k67ncM=",
     "signatures": []
   }
   ```

   令牌路径包含以下内容：
   + **service**：与令牌关联的仲裁服务的标识符。
   + **key\$1reference**：与此仲裁令牌关联的密钥的标识符。
   + **approval\$1data**：由 HSM 生成的 base64 编码原始数据令牌。
   + **令牌**：approval\$1data 的 base64 编码和 SHA-256 哈希令牌
   + **signatures**：未签名令牌的 base64 编码签名令牌（签名）的数组。每个批准者签名都采用 JSON 对象文字的形式：

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

     每个签名均由批准者使用相应的 RSA 2048 位私有密钥创建，其公有密钥通过 HSM 注册。

1. 验证新的用户服务仲裁令牌。**quorum token-sign list** 命令确认该令牌存在于 CloudHSM 上。

   ```
   aws-cloudhsm > quorum token-sign list
   {
     "error_code": 0,
     "data": {
       "tokens": [
         {
           "username": "crypto_user",
           "service": "key-usage",
           "key-reference": "0x0000000000680006",
           "minimum-token-count": 2
         }
       ]
     }
   }
   ```

   `minimum-token-count` 显示了从集群中单个 HSM 检索到的与用户名、服务和密钥引用相对应的最小可用密钥令牌数量的聚合集群视图。

   例如，假设一个 2-HSM 集群，如果我们从集群中的第一个 HSM 接收到由用户 `crypto_user1` 为引用为 `0x0000000000680006` 的密钥生成的两（2）个密钥使用令牌，并且我们从集群中的另一个 HSM 接收到由用户 `crypto_user1` 为引用为 `0x0000000000680006` 的密钥生成的一（1）个密钥使用令牌，我们将显示 `"minimum-token-count": 1`。

## 步骤 2：获得批准加密用户的签名
<a name="key-quorum-crypto-user-get-approval-signatures-chsm-cli"></a>

具有仲裁令牌的加密用户必须获得其他加密用户批准的令牌。为了提供其批准，其他加密用户使用其签名密钥以加密方式对 HSM 外的令牌进行签名。

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

在此示例中，具有令牌（`crypto-user`）的加密用户至少需要两（2）次批准。以下示例命令显示两（2）个加密用户如何使用 OpenSSL 以加密方式对令牌进行签名。

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

   ```
   $echo -n '5GlgoWOlQU4fw4QIlbxkPGZVOVoDugFGuSKE/k67ncM=' | base64 -d > crypto_user1.bin
   ```

1. 使用 OpenSSL 和批准者的私有密钥为未签名的二进制仲裁令牌签名，以获取用户服务和创建二进制签名文件：

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

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

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

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

   ```
   {
     "version": "2.0",
     "service": "key-usage",
     "key_reference": "0x0000000000680006",
     "approval_data": "AAIABQAAABkAAAAAAGgABi5CDa9x9VyyRIaFbkSrHgJjcnlwdG9fdXNlcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnPQBLAAAAAAAAAAAAAgAFAAAAGgAAAAAAaAAGQvd2qKY+GJj8gXo9lKuANGNyeXB0b191c2VyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGc9AEsAAAAAAAAAAA==",
     "token": "5GlgoWOlQU4fw4QIlbxkPGZVOVoDugFGuSKE/k67ncM=",
     "signatures": [
       {
         "username": "crypto_user1",
         "role": "crypto-user",
         "signature": "wa7aPzmGwBjcEoZ6jAzYASp841AfgOvcI27Y/tGlCj1E9DawnFw5Uf0IJT2Ca7T5XD2ThVkUi0B+dhAomdqYNl6aUUFrJyH9GBJ+E0PmA5jNVm25tzeRWBJzneTg4/zTeE2reNqrHFHicWnttQLe9jS09J1znuDGWDe0HaBKWUaz2gUInJRqmeXDsZYdSvZksrqUH5dci/RsaDE2+tGiS9g0RcIkFbsPW4HpGe2e5HVzGsqrV8O3PKlYQv6+fymfcNTTuoxKcHAkOjpl43QSuSIu2gVq7KI8mSmmWaPJL47NPjmcBVB5vdEQU+oiukaNfLJr+MoDKzAvCGDg4cDArg=="
       },
       {
         "username": "crypto_user2",
         "role": "crypto-user",
         "signature": "wa7aPzmGwBjcEoZ6jAzYASp841AfgOvcI27Y/tGlCj1E9DawnFw5Uf0IJT2Ca7T5XD2ThVkUi0B+dhAomdqYNl6aUUFrJyH9GBJ+E0PmA5jNVm25tzeRWBJzneTg4/zTeE2reNqrHFHicWnttQLe9jS09J1znuDGWDe0HaBKWUaz2gUInJRqmeXDsZYdSvZksrqUH5dci/RsaDE2+tGiS9g0RcIkFbsPW4HpGe2e5HVzGsqrV8O3PKlYQv6+fymfcNTTuoxKcHAkOjpl43QSuSIu2gVq7KI8mSmmWaPJL47NPjmcBVB5vdEQU+oiukaNfLJr+MoDKzAvCGDg4cDArg=="
       }
     ]
   }
   ```

## 步骤 3：在 CloudHSM; 集群上批准令牌并执行操作
<a name="key-quorum-crypto-user-approve-token-chsm-cli"></a>

在加密用户获得必要的批准和签名后，他们可以将该令牌以及密钥管理或密钥使用操作提供给 CloudHSM 集群。

确保密钥操作对应于与仲裁令牌关联的相应仲裁服务。有关更多信息，请参阅 [支持的服务和类型](key-quorum-auth-chsm-cli-service-names.md) 了解更多信息。

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

**Example 使用 RSA-PKCS 机制生成签名**  
在以下示例中，已登录加密用户将使用 HSM 上的密钥创建一个签名：  

```
aws-cloudhsm > crypto sign rsa-pkcs --key-filter attr.label=rsa-private-key-example --hash-function sha256 --data YWJjMTIz --approval /path/crypto_user1.token
      
{
  "error_code": 0,
  "data": {
    "key-reference": "0x0000000000640007",
    "signature": "h6hMqXacBrT3x3MXV13RXHdQno0+IQ6iy0kVrGzo23+eoWT0ZZgrSpBCu5KcuP6IYYHw9goQ5CfPf4jI1nO5m/IUJtF1A1lmcz0HjEy1CJ7ICXNReDRyeOU8m43dkJzt0OUdkbtkDJGAcxkbKHLZ02uWsGXaQ8bOKhoGwsRAHHF6nldTXquICfOHgSd4nimObKTqzUkghhJW5Ot5oUyLMYP+pZmUS38ythybney94Wj6fzYOER8v7VIY5ijQGa3LfxrjSG4aw6QijEEbno5LSf18ahEaVKmVEnDBL54tylCJBGvGsYSY9HNhuJoHPgiDL/TDd2wfvP4PaxbFRyyHaw=="
  }
}
```
如果加密用户尝试使用相同的令牌执行另一个 HSM 密钥使用操作，则操作将失败：  

```
aws-cloudhsm > crypto sign rsa-pkcs --key-filter attr.label=rsa-private-key-example --hash-function sha256 --data YWJjMTIz --approval /home/crypto_user1.token
{
  "error_code": 1,
  "data": "Quorum approval is required for this operation"
}
```
要执行其他 HSM 密钥操作，加密用户必须生成新的仲裁令牌，从批准者处获取新签名，然后使用 --approver 参数执行所需的密钥操作，以提供仲裁令牌。  
使用 **quorum token-sign list** 检查是否有可用的令牌。此示例显示加密用户没有已批准的令牌。  

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