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

4 分的閱讀內容
0

我有本地金鑰,我想要使用帶有 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-nameuser-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.keypayload_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.keypayload_rsa_pkcs8.pem 金鑰相同,您會收到下列輸出:

Files HSM_rsa_private.key and payload_rsa_pkcs8.pem are identical

相關資訊

支援的 PKCS #11 機制

OpenSSL

PKCS #11 規格的 Oasis 要求

RFC 3394

RFC 5649

AWS 官方
AWS 官方已更新 2 年前