このトピックでは、Cloud KMS に鍵をインポートする前に鍵を手動でラップする方法を説明します。Google Cloud CLI を使用して鍵をインポートする前に自動的にラップすることを望まない場合にのみ、このトピックの指示に従う必要があります。その違いの概要については、鍵のインポートの仕組みをご覧ください。
このトピックの手順(始める前にの手順は含まない)は 5〜10 分で完了できます。
始める前に
鍵をラップする前に、次の前提条件を満たす必要があります。
- ターゲット キーリングと鍵を作成し、インポート ジョブを作成します。
- Cloud KMS にインポートするために、鍵がローカルで使用可能で、正しくフォーマットされていることを確認します。
- OpenSSL にパッチを適用し、再コンパイします。
ラッピング鍵を取得する
このセクションでは、始める前にで作成したインポート ジョブからラッピング鍵を取得する方法について説明します。Google Cloud Console の使用をおすすめします。
Console
Google Cloud コンソールで、[鍵の管理] ページに移動します。
インポート ジョブが含まれる鍵リングの名前をクリックします。
ページの上部にある [インポート ジョブ] タブをクリックします。
その他アイコン more_vert をクリックし、ポップアップ メニューで [ラッピング鍵をダウンロード] をクリックします。
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
ImportJob.get
メソッドを呼び出します。ImportJob.get
レスポンスのpublicKey
フィールドから公開鍵を取得します。この値の型はWrappingPublicKey
です。WrappingPublicKey
型のpem
フィールドは、プライバシー強化メール(PEM)形式でエンコードされた公開鍵です。
PEM エンコード形式の詳細については、RFC 7468 の一般的な考慮事項と主体者公開鍵情報のテキスト エンコーディングのセクションを特にご覧ください。
環境変数を設定する
OpenSSL コマンドでは、入力値として複数のファイルパスが必要です。コマンドをより簡単に実行できるように、ファイルパスに対して環境変数を定義します。 以下で定義するディレクトリへの書き込み権限があることを確認します。
PUB_WRAPPING_KEY
変数を、インポート ジョブからダウンロードしたラッピング鍵へのフルパスに設定します。ラッピング鍵は.pem
で終了します。PUB_WRAPPING_KEY="WRAPPING_KEY_PATH"
TARGET_KEY
変数をラップ解除された(ターゲット)鍵へのフルパスに設定します。TARGET_KEY=TARGET_KEY_PATH
TARGET_KEY_PATH
は、対称鍵の場合は.bin
ファイルへのパス、非対称鍵の場合は.der
ファイルへのパスに置き換えます。RSA-AES でラップする場合は、
TEMP_AES_KEY
変数を一時 AES 鍵へのフルパスに設定します。TEMP_AES_KEY=TEMP_AES_KEY_PATH
WRAPPED_KEY
変数を、インポートの準備ができたラップされたターゲット鍵を保存するフルパスに設定します。WRAPPED_KEY=WRAPPED_KEY_PATH
次のコマンドを使用して、すべての環境変数が正しく設定されていることを確認します。
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-sha256
と rsa-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-256
、rsa-oaep-4096-sha1-aes-256
、rsa-oaep-3072-sha256-aes-256
、rsa-oaep-4096-sha256-aes-256
です。
32 バイト長のランダムな一時 AES 鍵を生成し、
${TEMP_AES_KEY}
で識別されるロケーションに保存します。openssl rand -out "${TEMP_AES_KEY}" 32
CKM_RSA_PKCS_OAEP
アルゴリズムを使用して、ラッピング公開鍵で一時 AES 鍵をラップします。 インポート方法がrsa-oaep-3072-sha1-aes-256
またはrsa-oaep-4096-sha1-aes-256
のいずれかの場合、rsa_oaep_md
とrsa_mgf1_md
にはsha1
を使用します。rsa-oaep-3072-sha256-aes-256
とrsa-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}
OpenSSL_V110
変数をopenssl.sh
スクリプトのパスに設定します。OpenSSL にパッチを適用し、再コンパイルするの手順を正しく実施した場合は、変数の値を変更せずに、このコマンドを使用できます。OPENSSL_V110="${HOME}/local/bin/openssl.sh"
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 仕様で必要です。
次のステップ
- これで、
WRAPPED_KEY
に保存されているラップされた鍵をインポートできるようになりました。鍵をインポートするには、手動でラッピングした鍵のインポートの手順を行います。