OpenSSL と key_mgmt_util コマンドラインツールを使用して、キーを CloudHSM に安全に転送するにはどうすればよいですか?
unWrapKey コマンドと key_mgmt_util コマンドラインツールを使用して、AWS CloudHSM にインポートしたいローカルキーがあります。ただし、プレーンテキストのキーをインポートまたはラップすることはできません。
解決方法
一時 AES キーでペイロードキーを暗号化します。一時 AES をキーペアの公開キーで暗号化します。その後、暗号化されたペイロードキーと暗号化された一時キーを単一のファイルに連結します。連結されたファイルは暗号化された形式で CloudHSM に送信され、キーペアのプライベートキーによって復号されます。AES_KEY_WRAP メカニズムは、一時 AES キーを復号し、そのキーを使用してペイロードキーを復号します。
次のキーを作成します。
- ペイロード AES または RSA キー。これは、CloudHSM でインポートして使用するキーです。
- ペイロードを暗号化するために AES_KEY_WRAP が必要とする一時 AES キー。暗号化できるものにサイズ制限はないため、AES を使用するのがベストプラクティスです。
- これらのキーを CloudHSM に安全にラップおよびラップ解除するために使用する RSA キーペア。
使用を開始する前に、エンベロープラッピングを許可する OpenSSL のパッチ適用済みバージョンがあることを確認します。手順については、CloudHSM CKM_RSA_AES_KEY_WRAP メカニズムで使用できるように OpenSSL にパッチを適用する方法を教えてくださいを参照してください。
ローカルキーを作成、暗号化、インポートする
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 キーの生の 16 進値を変数に出力します。
EPHEMERAL_AES_HEX=$(hexdump -v -e '/1 "%02X"' < ephemeral_aes)
注: hexdump ユーティリティがインストールされていることを確認してください。インストールされていない場合、このコマンドはエラーを返します。hexdump ユーティリティのインストール方法については、OS のドキュメントを参照してください。
3. OpenSSL enc コマンドを使用して、一時 AES キーでペイロードをラップします。-id-aes256-wrap-pad 暗号は、CKM_RSA_AES_KEY_WRAP と一致する RFC 3394 準拠のラッピングメカニズムです。-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. ローカルマシンから CloudHSM に RSA プライベートキーをインポートします。importPrivateKey を使用してインポートを管理するには、HSM で永続 AES キーを作成します。
注: 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
警告:このコマンドは、ユーザー名とパスワードの詳細をローカルに記録できます。鍵を譲渡した後は、パスワードを変更することをお勧めします。 暗号ユーザーパスワードを指定する代わりに、シェルスクリプトを作成して、パスワードがシェル履歴に記録されないようにすることもできます。このシェルスクリプトは key_mgmt_util のすべての引数を受け取り、それらをこのコマンドに送ります。これにより、シェルスクリプトを使用して上記のコマンドだけでなく、以下の他の 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. unWrapKey コマンドでインポートされた RSA プライベートキーを使用して、連結されたペイロードキーを HSM にラップ解除します。この例では、インポートされた RSA プライベートキーのキーハンドルとして -w 8 を使用します。
注: -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
注: AES キーをラップ解除するには -kc 4 -kt 31 を使用し、RSA プライベートキーをラップ解除するには -kc 3 -kt 0 を使用する必要があります。-m、-kc、および -kt パラメータの使用の詳細については、unWrapKey example を参照してください。
11. ペイロード AES キーが正常にインポートされた場合、次のような出力を受け取ります。
注: この例では、ラップ解除されている新しいキーのキーハンドル 10 を CloudHSM で使用できます。
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 format: -----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
注: AES キーをラップ解除するには -kc 4 -kt 31 を使用し、RSA プライベートキーをラップ解除するには -kc 3 -kt 0 を使用する必要があります。
これで、ペイロード 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 キーを DER に変換せずに PKCS # 8 形式に変換します。
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
関連情報
関連するコンテンツ
- 質問済み 5ヶ月前lg...
- 承認された回答質問済み 5ヶ月前lg...
- 質問済み 6年前lg...
- 質問済み 4ヶ月前lg...
- AWS公式更新しました 2年前
- AWS公式更新しました 3年前
- AWS公式更新しました 2年前