

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 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. 透過執行[產生規定人數權杖簽署](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. [產生規定人數權杖簽署](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**：核准資料的 base64 編碼和 SHA256 雜湊權杖。
   + **signed**：未簽署的權杖的 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，每個 HSM 都有相同的加密使用者，如 **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 金鑰管理/使用操作所需的加密使用者核准數目下限。如需與金鑰管理或金鑰用量相關聯之金鑰命令的詳細資訊，請參閱 [支援的服務和類型](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."
}
```