Knowledge Center Monthly Newsletter - March 2025
Stay up to date with the latest from the Knowledge Center. See all new and updated Knowledge Center articles published in the last month and re:Post’s top contributors.
OpenSSL と CloudHSM コマンドラインツールを使用して、キーを CloudHSM に安全に転送する方法を教えてください。
CloudHSM コマンドラインツール (CloudHSM CLI) でサブコマンド "key unwrap" を使用して、ローカルキーを AWS CloudHSM にインポートしたいです。
解決策
まず、ペイロードキーを一時的な Advanced Encryption Standard (AES) キーで暗号化します。次に、キーペアのパブリックキーを使用して一時 AES を暗号化します。最後に、暗号化されたペイロードキーと暗号化された一時キーを単一のファイルに連結します。連結されたファイルは暗号化された形式で CloudHSM に送信され、キーペアのプライベートキーによって復号されます。AES\ _KEY\ _WRAP メカニズムはエフェメラル AES キーを復号し、そのキーを使用してペイロードキーを復号します。
次のキーを作成します。
- ペイロードの AES、RSA、EC キーのうちいずれか。このキーを CloudHSM でインポートして使用します。
- AES_KEY_WRAP がペイロードを暗号化するために必要な一時 AES キー。暗号化できるものにサイズ制限はないため、AES を使用するのがベストプラクティスです。
- これらのキーを CloudHSM に安全にラップおよびラップ解除するために使用する RSA キーペア。
始める前に、エンベロープラップを使用するために OpenSSL v 3.x がインストールされていることを確認してください。
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: インポートされたペイロードキーに割り当てられたキーラベル
注: key generate-file コマンドと key unwrap コマンドでは、キーラベルがフィルター条件であるため、ラップを行うキーは一意に識別可能である必要があります。YOUR_WRAPPING_KEY_LABEL および YOUR_UNWRAPPING_KEY_LABEL が一意のキーラベルであることを確認してください。または、別のフィルター条件を使用してキーを一意に識別することもできます。キーフィルターの詳細については、「CloudHSM CLI を使用してキーをフィルター処理する」を参照してください。
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 キーの生の 16 進値を変数に出力します。
EPHEMERAL_AES_HEX=$(hexdump -v -e '/1 "%02X"' < ephemeral_aes)
注: hexdump ユーティリティがインストールされていることを確認してください。hexdump がインストールされていない場合、このコマンドはエラーを返します。hexdump ユーティリティのインストール方法については、お使いのオペレーティングシステム (OS) のドキュメントを参照してください。
-
OpenSSL enc コマンドを実行し、一時 AES キーを使用してペイロードをラップします。
openssl enc -id-aes256-wrap-pad -K $EPHEMERAL_AES_HEX -iv A65959A6 -in payload_aes -out payload_wrapped
注: 暗号 -id-aes256-wrap-pad は、CKM_RSA_AES_KEY_WRAP と適合する RFC 3394 準拠のラップメカニズムです。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 プライベートキーを使用して key unwrap 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 を使用してキー属性を割り当てます。オプションとキー属性の詳細については、それぞれ「key unwrap rsa-aes の例」と「CloudHSM CLI のキー属性」を参照してください。
ペイロードの 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 ペイロードをインポートするには、次の手順を実行します。
-
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 ペイロードをインポートする
RSA ペイロードをインポートするには、次の手順を実行します。
-
EC プライベートキーを CloudHSM 内でラップ解除するには、次のコマンドを実行し、ペイロードキーを EC プライベートキーに変更します。
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 を使用してキー属性を割り当てます。
関連情報

関連するコンテンツ
- AWS公式更新しました 5ヶ月前
- AWS公式更新しました 1年前
- AWS公式更新しました 1年前