Linux で OpenSSL を使用して鍵をラップする

このトピックでは、Cloud KMS に鍵をインポートする前に鍵を手動でラップする方法を説明します。Google Cloud CLI を使用して鍵をインポートする前に自動的にラップすることを望まない場合にのみ、このトピックの指示に従う必要があります。その違いの概要については、鍵のインポートの仕組みをご覧ください。

このトピックの手順(始める前にの手順は含まない)は 5〜10 分で完了できます。

始める前に

鍵をラップする前に、次の前提条件を満たす必要があります。

  1. ターゲット キーリングと鍵を作成し、インポート ジョブを作成します。
  2. Cloud KMS にインポートするために、鍵がローカルで使用可能で、正しくフォーマットされていることを確認します。
  3. OpenSSL にパッチを適用し、再コンパイします。

ラッピング鍵を取得する

このセクションでは、始める前にで作成したインポート ジョブからラッピング鍵を取得する方法について説明します。Google Cloud Console の使用をおすすめします。

Console

  1. Google Cloud コンソールで、[鍵の管理] ページに移動します。

    [鍵管理] ページに移動

  2. インポート ジョブが含まれる鍵リングの名前をクリックします。

  3. ページの上部にある [インポート ジョブ] タブをクリックします。

  4. その他アイコン をクリックし、ポップアップ メニューで [ラッピング鍵をダウンロード] をクリックします。

gcloud CLI

インポート ジョブがアクティブであることを確認するには、gcloud kms import-jobs describe コマンドを実行します。

gcloud kms import-jobs describe IMPORT_JOB \
  --location LOCATION \
  --keyring KEY_RING \
  --format="value(state)"
state: ACTIVE

次のコマンドを実行して、インポート ジョブの公開鍵を ${HOME}/wrapping-key.pem に保存します。

gcloud kms import-jobs describe \
  --location=LOCATION \
  --keyring=KEY_RING \
  --format="value(publicKey.pem)" \
  IMPORT_JOB > ${HOME}/wrapping-key.pem

API

  1. ImportJob.get メソッドを呼び出します。

  2. ImportJob.get レスポンスの publicKey フィールドから公開鍵を取得します。この値の型は WrappingPublicKey です。WrappingPublicKey 型の pem フィールドは、プライバシー強化メール(PEM)形式でエンコードされた公開鍵です。

PEM エンコード形式の詳細については、RFC 7468一般的な考慮事項主体者公開鍵情報のテキスト エンコーディングのセクションを特にご覧ください。

環境変数を設定する

OpenSSL コマンドでは、入力値として複数のファイルパスが必要です。コマンドをより簡単に実行できるように、ファイルパスに対して環境変数を定義します。 以下で定義するディレクトリへの書き込みアクセス権があることを確認します。

  1. PUB_WRAPPING_KEY 変数を、インポート ジョブからダウンロードしたラッピング鍵へのフルパスに設定します。ラッピング鍵は .pem で終了します。

    PUB_WRAPPING_KEY="WRAPPING_KEY_PATH"
    

  2. TARGET_KEY 変数をラップ解除された(ターゲット)鍵へのフルパスに設定します。

    TARGET_KEY=TARGET_KEY_PATH
    

    TARGET_KEY_PATH は、対称鍵の場合は .bin ファイルへのパス、非対称鍵の場合は .der ファイルのパスに置き換えます。

  3. RSA-AES でラップする場合は、TEMP_AES_KEY 変数を一時 AES 鍵のフルパスに設定します。

    TEMP_AES_KEY=TEMP_AES_KEY_PATH
    

  4. WRAPPED_KEY 変数を、インポート可能なラップされたターゲット鍵を保存するフルパスに設定します。

    WRAPPED_KEY=WRAPPED_KEY_PATH
    

  5. 次のコマンドを使用して、すべての環境変数が正しく設定されていることを確認します。

    echo "PUB_WRAPPING_KEY: " ${PUB_WRAPPING_KEY}; \
    echo "TARGET_KEY: " ${TARGET_KEY}; \
    echo "TEMP_AES_KEY: " ${TEMP_AES_KEY}; \
    echo "WRAPPED_KEY: " ${WRAPPED_KEY}
    

変数が正しく設定されると、鍵のラップの準備が整います。 以下で説明するように、RSA のみを使用する方法と RSA-AES を使用する方法の 2 つのアプローチがあります。

鍵のラップ

RSA で鍵をラップする

このアプローチでは、ターゲット鍵は RSA ブロックでラップされます。したがって、ターゲット鍵のサイズには制限があります。たとえば、この方法を使用して別の RSA 鍵をラップすることはできません。サポートされているインポート方法は rsa-oaep-3072-sha256rsa-oaep-4096-sha256 です。

  • CKM_RSA_PKCS_OAEP アルゴリズムを使用して、ラッピング公開鍵でターゲット鍵をラップします。

    openssl pkeyutl \
      -encrypt \
      -pubin \
      -inkey ${PUB_WRAPPING_KEY} \
      -in ${TARGET_KEY} \
      -out ${WRAPPED_KEY} \
      -pkeyopt rsa_padding_mode:oaep \
      -pkeyopt rsa_oaep_md:sha256 \
      -pkeyopt rsa_mgf1_md:sha256
    

RSA-AES で鍵をラップする

このアプローチでは、ターゲット鍵は一時 AES 鍵でラップされます。一時 AES 鍵は RSA 鍵によってラップされます。これら 2 つのラップされた鍵が連結され、インポートされます。ターゲット鍵は RSA ではなく AES を使用してラップされるため、大規模な鍵をラップするにはこの方法を使用できます。サポートされているインポート方法は、rsa-oaep-3072-sha1-aes-256rsa-oaep-4096-sha1-aes-256rsa-oaep-3072-sha256-aes-256rsa-oaep-4096-sha256-aes-256 です。

  1. 32 バイトのランダム一時 AES 鍵を生成し、${TEMP_AES_KEY} で識別される場所に保存します。

    openssl rand -out "${TEMP_AES_KEY}" 32
    

  2. CKM_RSA_PKCS_OAEP アルゴリズムを使用して、ラッピング公開鍵で一時 AES 鍵をラップします。 インポート方法が rsa-oaep-3072-sha1-aes-256 または rsa-oaep-4096-sha1-aes-256 のいずれかの場合、rsa_oaep_mdrsa_mgf1_md には sha1 を使用します。rsa-oaep-3072-sha256-aes-256rsa-oaep-4096-sha256-aes-256 には sha256 を使用します。

    openssl pkeyutl \
      -encrypt \
      -pubin \
      -inkey ${PUB_WRAPPING_KEY} \
      -in ${TEMP_AES_KEY} \
      -out ${WRAPPED_KEY} \
      -pkeyopt rsa_padding_mode:oaep \
      -pkeyopt rsa_oaep_md:{sha1|sha256} \
      -pkeyopt rsa_mgf1_md:{sha1|sha256}
    

  3. OpenSSL_V110 変数を openssl.sh スクリプトのパスに設定します。OpenSSL にパッチを適用し、再コンパイルするの手順を正しく実施した場合は、変数の値を変更せずに、このコマンドを使用できます。

    OPENSSL_V110="${HOME}/local/bin/openssl.sh"
    

  4. CKM_AES_KEY_WRAP_PAD アルゴリズムを使用して、ターゲット鍵を一時 AES 鍵でラップし、WRAPPED_KEY に追加します。

    "${OPENSSL_V110}" enc \
      -id-aes256-wrap-pad \
      -iv A65959A6 \
      -K $( hexdump -v -e '/1 "%02x"' < "${TEMP_AES_KEY}" ) \
      -in "${TARGET_KEY}" >> "${WRAPPED_KEY}"
    

    -iv A65959A6 フラグは、代替初期値として A65959A6 を設定します。これは RFC 5649 仕様で必要です。

次のステップ