このトピックでは、Cloud KMS に鍵をインポートする前に鍵を手動でラップする方法を説明します。Google Cloud CLI を使用して鍵をインポートする前に自動的にラップすることを望まない場合にのみ、このトピックの指示に従う必要があります。その違いの概要については、鍵のインポートの仕組みをご覧ください。
このトピックの手順(始める前にの手順は含まない)は 5〜10 分で完了できます。
始める前に
鍵をラップする前に、次の前提条件を満たす必要があります。
- ターゲット キーリングと鍵を作成し、インポート ジョブを作成します。
- Cloud KMS にインポートするために、鍵がローカルで使用可能で、正しくフォーマットされていることを確認します。
- OpenSSL にパッチを適用し、再コンパイします。
ラッピング鍵を取得する
このセクションでは、始める前にで作成したインポート ジョブからラッピング鍵を取得する方法について説明します。Google Cloud Console の使用をおすすめします。
Console
Cloud Console で [暗号鍵リング] ページに移動します。
インポート ジョブが含まれる鍵リングの名前をクリックします。
ページの上部にある [インポート ジョブ] タブをクリックします。
その他アイコン more_vert をクリックし、ポップアップ メニューで [ラッピング鍵をダウンロード] をクリックします。
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
[
ImportJob.get
][11] メソッドを呼び出します。ImportJob.get
レスポンスの [publicKey
][13] フィールドから公開鍵を取得します。この値の型は [WrappingPublicKey
][14] です。 [WrappingPublicKey
][22] 型の [pem
][21] フィールドは、プライバシー強化メール(PEM)形式でエンコードされた公開鍵です。
PEM エンコード形式の詳細については、RFC 7468 の一般的な考慮事項と主体者公開鍵情報のテキスト エンコーディングのセクションを特にご覧ください。
環境変数を設定する
OpenSSL コマンドでは、入力値として複数のファイルパスが必要です。コマンドをより簡単に実行できるように、ファイルパスに対して環境変数を定義します。
OpenSSL_V110
変数をopenssl.sh
スクリプトのパスに設定します。OpenSSL にパッチを適用し、再コンパイルするの手順を正しく実施した場合は、変数の値を変更せずに、このコマンドを使用できます。OPENSSL_V110="${HOME}/local/bin/openssl.sh"
PUB_WRAPPING_KEY
変数を、インポート ジョブからダウンロードしたラッピング鍵へのフルパスに設定します。ラッピング鍵は.pem
で終了します。次のコマンドは、
PUB_WRAPPING_KEY
変数を${HOME}/wrapping-key.pem
に設定します。PUB_WRAPPING_KEY="${HOME}/wrapping-key.pem"
TARGET_KEY
変数をラップ解除された鍵へのフルパスに設定します。- 対称鍵の場合は、
TARGET_KEY
を.bin
ファイルへのパスに設定します。 - 非対称鍵の場合は、
TARGET_KEY
は.der
ファイルへのパスに設定します。
TARGET_KEY=/path/to/key
- 対称鍵の場合は、
一時ファイルを書き込むディレクトリに
BASE_DIR
変数を設定し、必要に応じてディレクトリを作成します。このディレクトリには、現在のユーザーのみがアクセスできます。ディレクトリ名の末尾には/
を使用しないでください。BASE_DIR="${HOME}/wrap_tmp" mkdir -m 700 -p ${BASE_DIR}
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"
RSA_AES_WRAPPED_KEY
変数をフルパスに設定して、最終的にインポートするラップされたターゲット鍵を書き込みます。ディレクトリへの書き込み権限があることを確認します。RSA_AES_WRAPPED_KEY=/path/to/wrapped-target-key.bin mkdir -m u+wx -p $(dirname ${RSA_AES_WRAPPED_KEY})
次のコマンドを使用して、すべての環境変数が正しく設定されていることを確認します。
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}
変数が正しく設定されると、鍵のラップの準備が整います。
鍵のラップ
次のコマンドを実行して、32 バイトのランダム一時 AES 鍵を生成し、
${TEMP_AES_KEY}
で指定された場所に保存します。"${OPENSSL_V110}" rand -out "${TEMP_AES_KEY}" 32
CKM_RSA_PKCS_OAEP
アルゴリズムを使用して、ラッピング公開鍵で一時 AES 鍵をラップします。"${OPENSSL_V110}" rsautl \ -encrypt \ -pubin \ -inkey "${PUB_WRAPPING_KEY}" \ -in "${TEMP_AES_KEY}" \ -out "${TEMP_AES_KEY_WRAPPED}" \ -oaep
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 鍵でラップされています。
2 つのラップされた鍵を連結し、ファイルに出力を書き込みます。次のコマンドの 2 つの鍵の順序は変更しないでください。一時鍵はターゲット鍵の前に配置する必要があります。
cat "${TEMP_AES_KEY_WRAPPED}" "${TARGET_KEY_WRAPPED}" > "${RSA_AES_WRAPPED_KEY}"
不要になった中間ファイルを削除します。
rm ${BASE_DIR}/*
ラップされた鍵は、${RSA_AES_WRAPPED_KEY}
変数のロケーションに存在し、鍵のインポートのリクエストができるようになります。