OpenSSL と CloudHSM コマンドラインツールを使用して、キーを CloudHSM に安全に転送する方法を教えてください。
CloudHSM コマンドラインツール (CloudHSM CLI) でサブコマンド「key unwrap」を実行し、ローカルキーを AWS CloudHSM にインポートしたいです。
簡単な説明
まず、ペイロードキーを一時的な Advanced Encryption Standard (AES) キーで暗号化します。次に、キーペアのパブリックキーを使用して一時 AES キーを暗号化します。最後に、暗号化されたペイロードキーと暗号化された一時キーを単一のファイルに連結します。連結されたファイルは暗号化された形式で CloudHSM に送信され、キーペアのプライベートキーによって復号されます。AES_KEY_WRAP メカニズムはエフェメラル AES キーを復号し、そのキーを使用してペイロードキーを復号します。
注: Linux を実行する Amazon Elastic Compute Cloud (Amazon EC2) インスタンスで次の手順を実行します。必要な OpenSSL バージョンとユーティリティを含む Amazon Linux 2023 Amazon マシンイメージ (AMI) を使用することをおすすめします。
次のキーを作成します。
- インポートして CloudHSM で使用するペイロードの AES、RSA、または EC キー。
- AES_KEY_WRAP がペイロードの暗号化に必要とする一時的な AES キー。暗号化できるものにサイズ制限がない、AES を使用することをおすすめします。
- キーを CloudHSM に安全にラッピング、ラップ解除するために使用する RSA キーペア。
エンベロープラップを使用するには、OpenSSL バージョン 3.x が必要です。
お使いの OpenSSL バージョンを確認するには、次のコマンドを実行します。
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 コマンドのフィルター条件であるため、ラッピングとラップ解除用のキーラベルは一意である必要があります。または、別のフィルター条件を使用してキーを一意に識別することもできます。キーフィルターの詳細については、「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 を使用してキー属性を割り当てます。オプションとキー属性の詳細については、「CloudHSM CLI のキー属性」および「key unwrap rsa-aes コマンドの使用方法例」を参照してください。
ペイロードの 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 プライベートキーを 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 を使用してキー属性を割り当てます。
関連情報
- 言語
- 日本語
