OpenSSL と key_mgmt_util コマンドラインツールを使用して、キーを CloudHSM に安全に転送するにはどうすればよいですか?

所要時間4分
0

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-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

警告:このコマンドは、ユーザー名とパスワードの詳細をローカルに記録できます。鍵を譲渡した後は、パスワードを変更することをお勧めします。 暗号ユーザーパスワードを指定する代わりに、シェルスクリプトを作成して、パスワードがシェル履歴に記録されないようにすることもできます。このシェルスクリプトは 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_aespayload_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.keypayload_rsa_pkcs8.pem キーが同じ場合、次の出力を受け取ります。

Files HSM_rsa_private.key and payload_rsa_pkcs8.pem are identical

関連情報

サポートされている PKCS #11 メカニズム

OpenSSL

PKCS #11 仕様のオアシス要件

RFC 3394

RFC 5649

AWS公式
AWS公式更新しました 2年前
コメントはありません