如何使用 OpenSSL 和 key_mgmt_util 命令列工具將我的金鑰安全地傳輸到 CloudHSM?
我有本地金鑰,我想要使用帶有 key_mgmt_util 命令列工具的 unWrapKey 命令匯入到 AWS CloudHSM。但是,我無法匯入或隱藏純文本金鑰。
解決方法
使用暫時性 AES 金鑰加密您的承載金鑰。使用金鑰對中的公有金鑰加密暫時性 AES。然後,將加密的承載金鑰和加密的暫時性金鑰串連到單個檔案中。串連的檔案會以其加密格式傳送至您的 CloudHSM,然後由金鑰對中的私有金鑰解密。AES\ _KEY\ _WRAP機制會解密暫時性 AES 金鑰,並使用該金鑰來解密您的承載金鑰。
建立下列金鑰:
- 承載 AES 或 RSA 金鑰。這是您匯入並與 CloudHSM 搭配使用的金鑰。
- 加密承載AES_KEY_WRAP所需的臨時 AES 金鑰。使用 AES 是最佳實務,因為可以加密的內容沒有大小限制。
- RSA 金鑰對用於將這些金鑰安全地隱藏並解除隱藏至 CloudHSM 中。
在開始之前,請確保您有 OpenSSL 的修補版本以允許信封包裝。如需指示,請參閱如何修補 OpenSSL 以啟用與 CloudHSM CKM_RSA_AES_KEY_WRAP 機制搭配使用?
建立、加密和匯入本機金鑰
1. 執行這些命令以建立承載、暫時性金鑰和 RSA 金鑰。
**提示:**在自己的目錄中建立這些金鑰以追蹤檔案。
openssl rand -out payload_aes 32 openssl rand -out ephemeral_aes 32 openssl genrsa -out private.pem 2048 openssl rsa -in private.pem -out public.pem -pubout -outform PEM
2. 使用此指令,將暫時性 AES 金鑰的原始十六進位值輸出到變數中。
EPHEMERAL_AES_HEX=$(hexdump -v -e '/1 "%02X"' < ephemeral_aes)
**注意:**請確定您已安裝 hexdump 公用程式,否則此命令會傳回錯誤。請參閱您的作業系統文件,了解如何安裝 hexdump 公用程式。
3. 使用 OpenSSL enc 命令,以暫時性 AES 金鑰隱藏承載。-id-aes256-wrap-pad 密碼是符合 RFC 3394 的隱藏機制,它與 CKM_RSA_AES_KEY_WRAP 一致。-iv 值由 RFC 5649 (RFC 3394 的延伸) 設定。
OPENSSL_V111 enc -id-aes256-wrap-pad -K $EPHEMERAL_AES_HEX -iv A65959A6 -in payload_aes -out payload_wrapped
4. 使用您在步驟 1 中建立的 RSA 金鑰對中的公用金鑰來加密 AES 金鑰。
OPENSSL_V111 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 私有金鑰從您的本機電腦匯入 CloudHSM。在 HSM 中建立永久 AES 金鑰,以使用 importPrivateKey 管理匯入。
**注意:**將 user-name 和 user-password 取代為 CloudHSM 使用者名稱和密碼。
注意:如果您在 HSM 上建立 RSA 金鑰對,並使用exportPubKey 匯出公用金鑰,則可以略過步驟 6-9。
/opt/cloudhsm/bin/key_mgmt_util Cfm3Util singlecmd loginHSM -u CU -s user-name -p user-password genSymKey -t 31 -s 32 -l aes256
警告: 該命令可以在本地記錄您的使用者名稱和密碼的詳細資訊。轉移金鑰後,最佳實務是變更密碼。 您也可以撰寫 Shell 指令碼,而不是指定加密使用者密碼,以避免將密碼記錄在 Shell 歷史記錄中。該 Shell 指令碼將接收 key_mgmt_util 的所有引數,並將它們發送到這個命令。這允許您使用 Shell 指令碼執行前述命令以及下列其他 key_mgmt_util 命令。
7. 您會收到類似下列內容的輸出。請注意 AES 金鑰處理程式 — 用來匯入私有 RSA 金鑰。在此範例中,金鑰處理程式為7。
Command: genSymKey -t 31 -s 32 -l aes256 Cfm3GenerateSymmetricKey returned: 0x00 : HSM Return: SUCCESS Symmetric Key Created. Key Handle: 7 Cluster Error Status Node id 0 and err state 0x00000000 : HSM Return: SUCCESS
8. 匯入私有金鑰並將其隱藏至 HSM 中。匯入會使用您在步驟 6 中建立的永久 AES 金鑰來保護。 **注意:**將選項 -w 7 取代為您的金鑰處理程式。
/opt/cloudhsm/bin/key_mgmt_util Cfm3Util singlecmd loginHSM -u CU -s user-name -p user-password importPrivateKey -l private -f private.pem -w 7
9. 您會收到類似下列內容的輸出。請注意匯入的 RSA 私有金鑰處理程式。在此範例中,匯入的 RSA 私有金鑰為 8。
Cfm3WrapHostKey returned: 0x00 : HSM Return: SUCCESS Cfm3CreateUnwrapTemplate2 returned: 0x00 : HSM Return: SUCCESS Cfm3UnWrapKey returned: 0x00 : HSM Return: SUCCESS Private Key Imported. Key Handle: 8 Cluster Error Status Node id 0 and err state 0x00000000 : HSM Return: SUCCESS
10. 使用匯入的 RSA 私有金鑰搭配 unWrapKey 命令,將串連的承載金鑰解除隱藏至 HSM。此範例使用 -w 8 做為匯入 RSA 私有金鑰的金鑰處理程式。
**注意:**將 -w 8 取代為您的私有金鑰處理程式。
/opt/cloudhsm/bin/key_mgmt_util Cfm3Util singlecmd loginHSM -u CU -s user-name -p user-password unWrapKey -f rsa_aes_wrapped -w 8 -m 7 -noheader -l secretkey -kc 4 -kt 31
注意:您必須使用 -kc 4 -kt 31 解除隱藏 AES 金鑰,而 -kc 3-kt 0 能解除隱藏 RSA 私有金鑰。如需有關使用 -m、-kc 和 -kt 參數的詳細資訊,請參閱 unWrapKey 範例。
11. 您會收到成功匯入承載 AES 金鑰,類似下列輸出:
**注意:**在此範例中,可以在 CloudHSM 中使用全新無隱藏金鑰的金鑰處理程式 10。
Cfm3CreateUnwrapTemplate2 returned: 0x00 : HSM Return: SUCCESS Cfm2UnWrapWithTemplate3 returned: 0x00 : HSM Return: SUCCESS Key Unwrapped. Key Handle: 10 Cluster Error Status Node id 0 and err state 0x00000000 : HSM Return: SUCCESS
驗證您已匯入承載 AES 金鑰
1. 使用隱藏金鑰 -w 7 將承載 AES 金鑰匯出至磁碟。將承載金鑰處理程式 10 取代為您自己匯入的承載 AES 金鑰的值。
/opt/cloudhsm/bin/key_mgmt_util Cfm3Util singlecmd loginHSM -u CU -s user-name -p user-password exSymKey -k 10 -w 7 -out HSM.key
2. 執行此命令,將匯入的承載金鑰與 payload_aes 金鑰進行比較。
diff HSM.key payload_aes --report-identical-files
3. 如果 HSM.key 和 payload_aes 金鑰相同,您會收到下列輸出:
Files HSM.key and payload_aes are identical
匯入 RSA 承載
1. 如果您想將 RSA 私有金鑰解除隱藏至 HSM 中,請執行這些命令,將承載金鑰變更為 RSA 私有金鑰。
openssl genrsa -out payload_rsa.pem 2048 openssl rand -out ephemeral_aes 32 openssl genrsa -out private.pem 2048 openssl rsa -in private.pem -out public.pem -pubout -outform PEM
2. 在使用 OpenSSL 的「匯入 RSA 承載所需步驟」區段中,在步驟 1 中建立的 RSA 金鑰採用 PKCS #1 格式。不過,key_mgmt_util 工具會假設私有金鑰是 PKCS #8 DER 格式。使用您最愛的文字編輯器以純文字檢視金鑰,以確認格式類似如下列:
- PKCS1 格式:-----BEGIN RSA PRIVATE KEY----- - PKCS8 format: -----BEGIN PRIVATE KEY-----
3. 若要將 payload_rsa.pem 金鑰轉換為 pkcs8 格式並 DER 編碼,請執行以下命令:
openssl pkcs8 -topk8 -inform PEM -outform DER -in payload_rsa.pem -out payload_rsa_pkcs8.der -nocrypt
4. 遵循「建立、加密和匯入本機金鑰」區段中的步驟 2-9。
**注意:**將 payload_aes 取代為 payload_rsa_pkcs8.der。
5. 執行此命令將承載 RSA 私有金鑰解除隱藏至 CloudHSM 中,並記下輸出金鑰處理程式:
/opt/cloudhsm/bin/key_mgmt_util singlecmd loginHSM -u CU -s user-name -p user-password unWrapKey -f rsa_aes_wrapped -kc 3 -kt 0 -w 8 -l private_key -m 7 -noheader
**注意:**您必須使用 -kc 4 -kt 31 解除隱藏 AES 金鑰,而 -kc 3-kt 0 能解除隱藏 RSA 私有金鑰。
您現在已將承載 RSA 金鑰解除隱藏至 HSM 中。
確認您已匯入承載 RSA 私有金鑰
1. 使用您之前建立的包裝金鑰,將承載 RSA 私有金鑰匯出回磁碟。將承金鑰處理程式 25 取代為您自己匯入的承載 RSA 金鑰的值。
/opt/cloudhsm/bin/key_mgmt_util Cfm3Util singlecmd loginHSM -u CU -s user-name -p user-password exportPrivateKey -k 25 -w 7 -out HSM_rsa_private.key
2. 執行此命令可將有 payload_rsa 金鑰轉換為 PKCS #8 格式,而不轉換為 DER。
openssl pkcs8 -topk8 -inform PEM -outform PEM -in payload_rsa.pem -out payload_rsa_pkcs8.pem -nocrypt
3. 執行此命令,將匯入的承載金鑰與 payload_rsa 金鑰進行比較。
diff HSM_rsa_private.key payload_rsa_pkcs8.pem --report-identical-files
4. 如果 HSM\ rsa\ _private.key 和 payload_rsa_pkcs8.pem 金鑰相同,您會收到下列輸出:
Files HSM_rsa_private.key and payload_rsa_pkcs8.pem are identical
相關資訊
相關內容
- 已提問 1 年前lg...
- 已提問 1 年前lg...
- AWS 官方已更新 3 年前
- AWS 官方已更新 4 個月前
- AWS 官方已更新 2 個月前