OpenSSL と CloudHSM コマンドラインツールを使用して、キーを CloudHSM に安全に転送する方法を教えてください。

所要時間4分
0

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 ペイロードをインポートする

ローカルキーを作成、暗号化、インポートするには、次の手順を実行します。

  1. ペイロードの 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

    注: ファイルを追跡するには、これらのキーをそれぞれ自体のディレクトリに作成します。

  2. 次のコマンドを実行して、一時 AES キーの生の 16 進値を変数に出力します。

    EPHEMERAL_AES_HEX=$(hexdump -v -e '/1 "%02X"' < ephemeral_aes)

    注: hexdump ユーティリティがインストールされていることを確認してください。hexdump がインストールされていない場合、このコマンドはエラーを返します。hexdump ユーティリティのインストール方法については、お使いのオペレーティングシステム (OS) のドキュメントを参照してください。

  3. 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 キーラップのアルゴリズム」を参照してください。

  4. 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
  5. ローカルマシンで暗号化されたペイロードキーとエフェメラル AES キーを連結し、rsa_aes_wrapped という名前の単一ファイルを作成します。

    cat ephemeral_wrapped payload_wrapped > rsa_aes_wrapped
  6. 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 ペイロードをインポートするには、次の手順を実行します。

  1. RSA プライベートキーを CloudHSM 内でラップ解除する場合は、次のコマンドを実行し、ペイロードキーを RSA プライベートキーに変更します。

    openssl genrsa -out payload_rsa.pem 2048
    openssl rand -out ephemeral_aes 32
  2. プレーンテキストエディタを使用して、RSA キーの形式を確認します。

    PKCS1 format: -----BEGIN RSA PRIVATE KEY----- - PKCS8 format: -----BEGIN PRIVATE KEY-----

    注: RSA キーは PKCS #1 形式です。ただし、CloudHSM CLI では、プライベートキーが PKCS #8 DER 形式であることを前提としています。

  3. 次のコマンドを実行して payload_rsa.pem キーを PKCS #8 形式に変換し、DER エンコードします。

    openssl pkcs8 -topk8 -inform PEM -outform DER -in payload_rsa.pem -out payload_rsa_pkcs8.der -nocrypt
  4. AES ペイロードのインポート」セクションのステップ 2 ~ 5 を実行します。payload_aespayload_rsa_pkcs8.der に置き換えます。

  5. 次のコマンドを実行し、ペイロード 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 ペイロードをインポートするには、次の手順を実行します。

  1. EC プライベートキーを CloudHSM 内でラップ解除するには、次のコマンドを実行し、ペイロードキーを EC プライベートキーに変更します。

    openssl ecparam -name secp256k1 -genkey -noout -out payload_ec.pemopenssl rand -out ephemeral_aes 32
  2. プレーンテキストエディタを使用して EC キーの形式を確認します。

    PKCS1 format: -----BEGIN EC PRIVATE KEY----- - PKCS8 format: -----BEGIN PRIVATE KEY-----

    注: EC キーは PKCS #1 形式です。ただし、CloudHSM CLI では、プライベートキーが PKCS #8 DER 形式であることを前提としています。

  3. 次のコマンドを実行して payload_ec.pem キーを PKCS #8 形式に変換し、DER エンコードします。

    openssl pkcs8 -topk8 -inform PEM -outform DER -in payload_ec.pem -out payload_ec_pkcs8.der -nocrypt
  4. AES ペイロードのインポート」セクションのステップ 2 ~ 5 を実行します。payload_aespayload_ec_pkcs8.der に置き換えます。

  5. ペイロードの 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 CloudHSM Client SDK 5 の PKCS #11 でサポートされるメカニズム

AWS公式
AWS公式更新しました 3ヶ月前
コメントはありません

関連するコンテンツ