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

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

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

始める前に

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

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

ラッピング鍵を取得する

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

コンソール

  1. Cloud Console で [暗号鍵] ページに移動します。

    [暗号鍵] ページに移動

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

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

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

gcloud

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

gcloud kms import-jobs describe import-job \
  --location location \
  --keyring key-ring-name \
  --format="value(state)"
state: ACTIVE

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

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

API

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

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

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

環境変数を設定する

OpenSSL コマンドでは、入力値として複数のファイルパスが必要です。コマンドをより簡単に実行できるように、ファイルパスに対して環境変数を定義します。

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

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

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

    次のコマンドは、PUB_WRAPPING_KEY 変数を ${HOME}/wrapping-key.pem に設定します。

    PUB_WRAPPING_KEY="${HOME}/wrapping-key.pem"
    

  3. TARGET_KEY 変数をラップ解除された鍵へのフルパスに設定します。

    • 対称鍵の場合は、TARGET_KEY.bin ファイルへのパスに設定します。
    • 非対称鍵の場合は、TARGET_KEY.der ファイルへのパスに設定します。
    TARGET_KEY=/path/to/key
    

  4. 一時ファイルを書き込むディレクトリに BASE_DIR 変数を設定し、必要に応じてディレクトリを作成します。このディレクトリには、現在のユーザーのみがアクセスできます。ディレクトリ名の末尾には / を使用しないでください。

    BASE_DIR="${HOME}/wrap_tmp"
    mkdir -m 700 -p ${BASE_DIR}
    

  5. 3 つの中間ファイルに環境変数を定義します。

    TEMP_AES_KEY="${BASE_DIR}/temp_aes_key.bin"
    TEMP_AES_KEY_WRAPPED="${BASE_DIR}/temp_aes_key_wrapped.bin"
    TARGET_KEY_WRAPPED="${BASE_DIR}/target_key_wrapped.bin"
    

  6. RSA_AES_WRAPPED_KEY 変数をフルパスに設定して、最終的にインポートするラップされたターゲット鍵を書き込みます。ディレクトリへの書き込み権限があることを確認します。

    RSA_AES_WRAPPED_KEY=/path/to/wrapped-target-key.bin
    mkdir -m u+wx -p $(dirname ${RSA_AES_WRAPPED_KEY})
    

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

    echo "OPENSSL_V110: " ${OPENSSL_V110}; \
    echo "PUB_WRAPPING_KEY: " ${PUB_WRAPPING_KEY}; \
    echo "TARGET_KEY: " ${TARGET_KEY}; \
    echo "BASE_DIR: " ${BASE_DIR}; \
    echo "TEMP_AES_KEY: " ${TEMP_AES_KEY}; \
    echo "TEMP_AES_KEY_WRAPPED: " ${TEMP_AES_KEY_WRAPPED}; \
    echo "TARGET_KEY_WRAPPED: " ${TARGET_KEY_WRAPPED}; \
    echo "RSA_AES_WRAPPED_KEY: " ${RSA_AES_WRAPPED_KEY}
    

変数が正しく設定されると、鍵のラップの準備が整います。

鍵のラップ

  1. 次のコマンドを実行して、32 バイトのランダム一時 AES 鍵を生成し、${TEMP_AES_KEY} で指定された場所に保存します。

    "${OPENSSL_V110}" rand -out "${TEMP_AES_KEY}" 32
    

  2. CKM_RSA_PKCS_OAEP アルゴリズムを使用して、ラッピング公開鍵で一時 AES 鍵をラップします。

    "${OPENSSL_V110}" rsautl \
       -encrypt \
       -pubin \
       -inkey "${PUB_WRAPPING_KEY}" \
       -in "${TEMP_AES_KEY}" \
       -out "${TEMP_AES_KEY_WRAPPED}" \
       -oaep
    

  3. CKM_AES_KEY_WRAP_PAD アルゴリズムを使用して、ターゲット鍵を一時 AES 鍵でラップします。target-key-file は、鍵の .bin ファイルまたは pub ファイルの名前で置き換えます。

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

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

    これで 2 つの鍵がラップされました。

    • ${TEMP_AES_KEY_WRAPPED} は、ローカル システムで作成した一時 AES 鍵で、インポート ジョブの公開鍵でラップされます。
    • ${TARGET_KEY_WRAPPED} は、インポートするターゲット鍵で、生成した一時 AES 鍵でラップされています。
  4. 2 つのラップされた鍵を連結し、ファイルに出力を書き込みます。次のコマンドの 2 つの鍵の順序は変更しないでください。一時鍵はターゲット鍵の前に配置する必要があります。

    cat "${TEMP_AES_KEY_WRAPPED}" "${TARGET_KEY_WRAPPED}" > "${RSA_AES_WRAPPED_KEY}"
    
  5. 不要になった中間ファイルを削除します。

    rm ${BASE_DIR}/*
    

ラップされた鍵は、${RSA_AES_WRAPPED_KEY} 変数のロケーションに存在し、鍵のインポートのリクエストができるようになります。