スキップしてコンテンツを表示

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

所要時間4分
0

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

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

  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 を使用してキー属性を割り当てます。オプションとキー属性の詳細については、「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 ペイロードをインポートする

次の手順を実行します。

  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公式更新しました 1年前
コメントはありません

関連するコンテンツ