Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何使用 OpenSSL 和 CloudHSM 命令列工具將我的金鑰安全地傳輸到 CloudHSM?
我想使用 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 承載
若要建立、加密和匯入本機金鑰,請完成下列步驟:
-
若要建立承載 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**注意:**若要追蹤檔案,請在其自己的目錄中建立這些金鑰。
-
若要將暫時性 AES 金鑰的原始十六進位值放入變數,請執行下列命令:
EPHEMERAL_AES_HEX=$(hexdump -v -e '/1 "%02X"' < ephemeral_aes)**注意:**請確定已安裝 hexdump 公用程式。如果您沒有安裝 hexdump,則前面的命令會傳回錯誤。如需如何安裝 hexdump 公用程式的指示,請參閱您的作業系統 (OS) 文件。
-
若要使用暫時性 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 金鑰包裝演算法。
-
使用 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 -
從您的本機電腦,將加密的承載金鑰和暫時性 AES 金鑰串連到名為 rsa_aes_wrapped 的單一檔案中:
cat ephemeral_wrapped payload_wrapped > rsa_aes_wrapped -
若要使用 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 承載
請完成下列步驟:
-
若要將 RSA 私有金鑰解除包裝至 CloudHSM 中,請執行下列命令,將承載金鑰變更為 RSA 私有金鑰:
openssl genrsa -out payload_rsa.pem 2048 openssl rand -out ephemeral_aes 32 -
使用純文字編輯器來檢查 RSA 金鑰的格式:
PKCS1 format: -----BEGIN RSA PRIVATE KEY----- - PKCS8 format: -----BEGIN PRIVATE KEY-----**注意:**RSA 金鑰是 PKCS #1 格式。但是,CloudHSM CLI 假設私密金鑰是 PKCS #8 DER 格式。
-
若要將 payload_rsa.pem 金鑰轉換為 PKCS #8 格式並且為 DER 編碼,請執行下列命令:
openssl pkcs8 -topk8 -inform PEM -outform DER -in payload_rsa.pem -out payload_rsa_pkcs8.der -nocrypt -
完成匯入 AES 有效負載一節中的步驟 2-5。將 payload_aes 取代為 payload_rsa_pkcs8.der。
-
若要將有效負載 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 承載
若要匯入承載,請完成下列步驟:
-
若要將 EC 私密金鑰解除包裝至 HSM 中,請執行下列命令,將承載金鑰變更為 RSA 私密金鑰:
openssl ecparam -name secp256k1 -genkey -noout -out payload_ec.pemopenssl rand -out ephemeral_aes 32 -
使用純文字編輯器來檢查 EC 金鑰的格式:
PKCS1 format: -----BEGIN EC PRIVATE KEY----- - PKCS8 format: -----BEGIN PRIVATE KEY-----**注意:**EC 金鑰是 PKCS #1 格式。但是,CloudHSM CLI 假設私密金鑰是 PKCS #8 DER 格式。
-
若要將 payload_ec.pem 金鑰轉換為 PKCS #8 格式並且為 DER 編碼,請執行下列命令:
openssl pkcs8 -topk8 -inform PEM -outform DER -in payload_ec.pem -out payload_ec_pkcs8.der -nocrypt -
完成匯入 AES 有效負載一節中的步驟 2-5。將 payload_aes 取代為 payload_ec_pkcs8.der。
-
若要將承載 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 來指派金鑰屬性。
相關資訊
- 語言
- 中文 (繁體)

相關內容
- 已提問 3 年前
- 已提問 1 年前
- 已提問 1 年前
- 已提問 2 年前