跳至內容

如何使用 OpenSSL 和 CloudHSM 命令列工具將我的金鑰安全地傳輸到 CloudHSM?

4 分的閱讀內容
0

我想使​​用 CloudHSM 命令列工具 (CloudHSM CLI) 執行「key unwrap」子命令,將本機金鑰匯入 AWS CloudHSM。

簡短描述

首先,使用暫時性進階加密標準 (AES) 金鑰加密您的承載金鑰。然後,使用金鑰對中的公有金鑰加密暫時性 AES 金鑰。最後,將加密的承載金鑰和加密的暫時性金鑰串連到單個檔案中。檔案會以加密格式傳送到您的 CloudHSM,而私密金鑰會從金鑰對中解密檔案。AES_KEY_WRAP 機制會解密暫時性 AES 金鑰,並使用該金鑰來解密您的承載金鑰。

**注意:**在執行 Linux 的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體上完成下列步驟。最佳做法是使用包含所需 OpenSSL 版本和公用程式的 Amazon Linux 2023 Amazon Machine Image (AMI)。

建立下列金鑰:

  • 您匯入並與 CloudHSM 一起使用的承載 AES、RSA 或 EC 金鑰。
  • AES_KEY_WRAP 加密承載所需的臨時 AES 金鑰。最佳做法是使用 AES,因為可加密的項目沒有大小限制。
  • RSA 金鑰對可將這些金鑰安全地包裝並解除包裝至 CloudHSM 中。

要使用封套包裝,您必須擁有 OpenSSL 版本 3.x。

若要判斷您擁有的 OpenSSL 版本,請執行下列命令:

openssl version

輸出範例:

OpenSSL 3.0.8 7 Feb 2023 (Library: OpenSSL 3.0.8 7 Feb 2023)

解決方法

**注意:**在以下命令中,將以下值替換為您的值:

  • YOUR_CRYPTO_USER_NAME 替換為您的加密使用者名稱
  • YOUR_CRYPTO_USER_PASSWORD 替換為您的密碼
  • YOUR_WRAPPING_KEY_LABEL 替換為您指派用於包裝 RSA 公有金鑰的金鑰標籤
  • YOUR_UNWRAPPING_KEY_LABEL 替換為您指派用於將 RSA 私有金鑰解除包裝的金鑰標籤
  • YOUR_IMPORTED_KEY_LABEL 替換為您指派用於匯入承載金鑰的金鑰標籤

您的包裝和解除包裝標籤必須是唯一的,因為金鑰標籤是金鑰產生檔案金鑰解除包裝命令的篩選條件。或者,您可以使用不同的篩選條件來唯一識別金鑰。如需金鑰篩選條件的詳細資訊,請參閱使用 CloudHSM 篩選金鑰

設定 CloudHSM CLI 的加密使用者憑證

執行下列命令:

export CLOUDHSM_ROLE="crypto-user"
export CLOUDHSM_PIN="YOUR_CRYPTO_USER_NAME:YOUR_CRYPTO_USER_PASSWORD"

匯入 AES 承載

若要建立、加密和匯入本機金鑰,請完成下列步驟:

  1. 若要建立承載 AES、暫時性 AES 和 RSA 金鑰,請執行下列命令:

    openssl rand -out payload_aes 32
    openssl rand -out ephemeral_aes 32
    /opt/cloudhsm/bin/cloudhsm-cli key generate-asymmetric-pair rsa --public-label YOUR_WRAPPING_KEY_LABEL --private-label YOUR_UNWRAPPING_KEY_LABEL --modulus-size-bits 4096 --public-exponent 65537 --private-attributes unwrap=true
    /opt/cloudhsm/bin/cloudhsm-cli key generate-file --encoding pem --path public.pem --filter attr.label=YOUR_WRAPPING_KEY_LABEL

    **注意:**若要追蹤檔案,請在其自己的目錄中建立這些金鑰。

  2. 若要將暫時性 AES 金鑰的原始十六進位值放入變數,請執行下列命令:

    EPHEMERAL_AES_HEX=$(hexdump -v -e '/1 "%02X"' < ephemeral_aes)

    **注意:**請確定已安裝 hexdump 公用程式。如果您沒有安裝 hexdump,則前面的命令會傳回錯誤。如需如何安裝 hexdump 公用程式的指示,請參閱您的作業系統 (OS) 文件。

  3. 若要使用暫時性 AES 金鑰包裝承載,執行 OpenSSL enc 命令:

    openssl enc -id-aes256-wrap-pad -K $EPHEMERAL_AES_HEX -iv A65959A6 -in payload_aes -out payload_wrapped

    注意:****-id-aes256-wrap-pad 密碼是符合 RFC 3394 的包裝機制,它與 CKM_RSA_AES_KEY_WRAP 共存。RFC 3394 延伸模組 RFC 5649 會設定 -iv 值。如需詳細資訊,請參閱 IETF 網站上的 AES 金鑰包裝與填補演算法AES 金鑰包裝演算法

  4. 使用 RSA 金鑰對中的公有金鑰加密 AES 金鑰:

    openssl pkeyutl -encrypt -in ephemeral_aes -out ephemeral_wrapped -pubin -inkey public.pem -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha1 -pkeyopt rsa_mgf1_md:sha1
  5. 從您的本機電腦,將加密的承載金鑰和暫時性 AES 金鑰串連到名為 rsa_aes_wrapped 的單一檔案中:

    cat ephemeral_wrapped payload_wrapped > rsa_aes_wrapped
  6. 若要使用 RSA 私有金鑰與金鑰解除包裝 rsa-aes,將聯結的承載金鑰解除包裝到 CloudHSM,請執行下列命令:

    /opt/cloudhsm/bin/cloudhsm-cli key unwrap rsa-aes --data-path rsa_aes_wrapped --key-type-class aes --label YOUR_IMPORTED_KEY_LABEL --hash-function sha1 --mgf mgf1-sha1 --filter attr.label=YOUR_UNWRAPPING_KEY_LABEL --attributes decrypt=true encrypt=true

    **注意:**您必須使用 --key-type-class aes 來將 AES 金鑰解除包裝。根據金鑰使用情況,使用 --attributes 來指派金鑰屬性。如需有關選項和金鑰屬性的詳細資訊,請參閱 CloudHSM CLI 的金鑰屬性以及如何使用金鑰解除包裝 rsa-aes 命令的範例

    您會收到匯入承載 AES 金鑰,類似於下列輸出:

    {
      "error_code": 0,
      "data": {
        "key": {
          "key-reference": "0x000000000068031a",
          "key-info": {
            "key-owners": [
              {
                "username": "YOUR_CRYPTO_USER_NAME",
                "key-coverage": "full"
              }
            ],
            "shared-users": [],
            "cluster-coverage": "full"
          },
          "attributes": {
            "key-type": "aes",
            "label": "YOUR_IMPORTED_KEY_LABEL",
            "id": "0x",
            "check-value": "0xb31c2a",
            "class": "secret-key",
            "encrypt": true,
            "decrypt": true,
            "token": true,
            "always-sensitive": false,
            "derive": false,
            "destroyable": true,
            "extractable": true,
            "local": false,
            "modifiable": true,
            "never-extractable": false,
            "private": true,
            "sensitive": true,
            "sign": true,
            "trusted": false,
            "unwrap": false,
            "verify": true,
            "wrap": false,
            "wrap-with-trusted": false,
            "key-length-bytes": 32
          }
        }
      }
    }

匯入 RSA 承載

請完成下列步驟:

  1. 若要將 RSA 私有金鑰解除包裝至 CloudHSM 中,請執行下列命令,將承載金鑰變更為 RSA 私有金鑰:

    openssl genrsa -out payload_rsa.pem 2048
    openssl rand -out ephemeral_aes 32
  2. 使用純文字編輯器來檢查 RSA 金鑰的格式:

    PKCS1 format: -----BEGIN RSA PRIVATE KEY----- - PKCS8 format: -----BEGIN PRIVATE KEY-----

    **注意:**RSA 金鑰是 PKCS #1 格式。但是,CloudHSM CLI 假設私密金鑰是 PKCS #8 DER 格式。

  3. 若要將 payload_rsa.pem 金鑰轉換為 PKCS #8 格式並且為 DER 編碼,請執行下列命令:

    openssl pkcs8 -topk8 -inform PEM -outform DER -in payload_rsa.pem -out payload_rsa_pkcs8.der -nocrypt
  4. 完成匯入 AES 有效負載一節中的步驟 2-5。將 payload_aes 取代為 payload_rsa_pkcs8.der

  5. 若要將有效負載 RSA 私密金鑰解除包裝至 CloudHSM,請執行下列命令:

    /opt/cloudhsm/bin/cloudhsm-cli key unwrap rsa-aes --data-path rsa_aes_wrapped --key-type-class rsa-private --label YOUR_IMPORTED_KEY_LABEL --hash-function sha1 --mgf mgf1-sha1 --filter attr.label=YOUR_UNWRAPPING_KEY_LABEL --attributes decrypt=true sign=true

    **注意:**您必須使用 --key-type-class rsa-private 來解除包裝 RSA 金鑰。根據金鑰使用情況,使用 --attributes 來指派金鑰屬性。

匯入 EC 承載

若要匯入承載,請完成下列步驟:

  1. 若要將 EC 私密金鑰解除包裝至 HSM 中,請執行下列命令,將承載金鑰變更為 RSA 私密金鑰:

    openssl ecparam -name secp256k1 -genkey -noout -out payload_ec.pemopenssl rand -out ephemeral_aes 32
  2. 使用純文字編輯器來檢查 EC 金鑰的格式:

    PKCS1 format: -----BEGIN EC PRIVATE KEY----- - PKCS8 format: -----BEGIN PRIVATE KEY-----

    **注意:**EC 金鑰是 PKCS #1 格式。但是,CloudHSM CLI 假設私密金鑰是 PKCS #8 DER 格式。

  3. 若要將 payload_ec.pem 金鑰轉換為 PKCS #8 格式並且為 DER 編碼,請執行下列命令:

    openssl pkcs8 -topk8 -inform PEM -outform DER -in payload_ec.pem -out payload_ec_pkcs8.der -nocrypt
  4. 完成匯入 AES 有效負載一節中的步驟 2-5。將 payload_aes 取代為 payload_ec_pkcs8.der

  5. 若要將承載 EC 私密金鑰解除包裝至 CloudHSM,請執行下列命令:

    /opt/cloudhsm/bin/cloudhsm-cli key unwrap rsa-aes --data-path rsa_aes_wrapped --key-type-class ec-private --label YOUR_IMPORTED_KEY_LABEL --hash-function sha1 --mgf mgf1-sha1 --filter attr.label=YOUR_UNWRAPPING_KEY_LABEL --attributes decrypt=true sign=true

    **注意:**您必須使用 --key-type-class ec-private 來解除包裝 EC 金鑰。根據金鑰使用情況,使用 --attributes 來指派金鑰屬性。

相關資訊

AWS CloudHSM 用戶端 SDK 5 的 PKCS #11 程式庫支援機制

AWS 官方已更新 1 年前