

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

# 使用 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\_user1.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\_data**：base64 编码的随机数据令牌，其原始数据最大不超过 245 字节。
   + **未签名：ap** proval\_data 的 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\_user.pub**：公有密钥 PEM 文件的文件路径  
**是否必需**：是  
**/path/token\_file**：用户私有密钥签名令牌的文件路径  
**是否必需**：是

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\_user2>}}过程中与之共享密钥。另请注意，公有密钥没有仲裁值。

```
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."
}
```