CNG プロバイダと SignTool を使用して Windows アーティファクトに署名する

このガイドでは、CNG プロバイダと SignTool を使用して Microsoft Authenticode 署名用の Cloud HSM 鍵を作成する手順について説明します。

このチュートリアルの Terraform ベースのブループリント バージョンは、kms-solutions GitHub リポジトリにあります。

ユースケース

このドキュメントで説明するワークフローは、次の企業のセキュリティ ニーズに対応する際に役立ちます。

  • FIPS140-2 レベル 3 HSM で保護された秘密鍵でファームウェアに署名します。
  • Windows の標準の SignTool ツールを使用して Windows アーティファクトに署名します。

準備

このチュートリアルを完了するには、次の準備が必要です。

  • 署名するアーティファクトを含む Windows マシン。
  • 最新の Cloud KMS CNG プロバイダ リリース。付属の .msi インストーラを使用して Windows マシンにインストールできます。
  • Cloud Shell または独自の Linux マシン。証明書署名リクエストまたは証明書を生成します。このマシンで、OpenSSL のセットアップに記載されている構成を完了し、PKCS#11 ライブラリをダウンロードして構成します。

まだ実行していない場合は、必ず gcloud auth application-default login を実行してください。

まだ Windows マシンにダウンロードしていない場合は、SignTool を含む最新の Windows SDK をダウンロードします。

構成

Cloud KMS でホストされる署名鍵を作成する

Cloud Shell または独自のマシンで次のコマンドを使用し、Google Cloud プロジェクトに Cloud KMS キーリングを作成します。

gcloud kms keyrings create "KEY_RING" --location "LOCATION"

次に、作成したキーリングに、Google Cloud プロジェクトの Cloud KMS EC-P256-SHA256 ハードウェア署名鍵を作成します。

gcloud kms keys create "KEY_NAME" --keyring "KEY_RING" \
  --project "PROJECT_ID" --location "LOCATION" \
  --purpose "asymmetric-signing" --default-algorithm "ec-sign-p256-sha256" \
  --protection-level "hsm"

HSM 証明書をダウンロードする

HSM 証明書は、鍵が HSM 内にあることを証明します。この証明は、認証局(CA)が Extended Validation(EV)証明書を発行する際に必要になることがあります。

Cloud KMS 鍵に関連付けられた HSM 証明書をダウンロードするには、次の手順を行います。

  1. Google Cloud コンソールで [Key Management] ページに移動します。

    Key Management に移動

  2. 証明する鍵を含むキーリングを選択してから、鍵を選択します。

  3. 証明する鍵バージョンのその他アイコン をクリックし、[証明書を検証] をクリックします。

  4. [証明書を検証] ダイアログで [証明書バンドルをダウンロード] をクリックします。これにより、証明書チェーンを含む zip ファイルがダウンロードされます。

ダウンロードした証明書を検証する方法の詳細については、証明書を解析するをご覧ください。

OpenSSL で自己署名証明書を作成する

この手順は省略可能ですが、認証局によって署名された証明書の購入プロセスと購入費用を確認する前に以降の手順を把握するのに役立ちます。

Cloud Shell または独自のマシンを使用して、Cloud KMS にホストされている署名鍵を使用して自己署名証明書を生成します。OpenSSL を使用すると、ファイルパスの代わりに PKCS #11 URI を使用して、ラベルで鍵を識別できます。Cloud KMS PKCS #11 ライブラリの鍵ラベルは、CryptoKey 名と同じです。

openssl req -new -x509 -days 3650 -subj '/CN=test/' -sha256 -engine pkcs11 \
  -keyform engine -key pkcs11:object=KEY_NAME > ca.cert

このコマンドが失敗した場合、PKCS11_MODULE_PATH が正しく設定されていないか、Cloud KMS 署名鍵を使用するための適切な権限がない可能性があります。

次のような証明書が作成されます。

-----BEGIN CERTIFICATE-----
...
...
...
-----END CERTIFICATE-----

証明書を Windows マシンにコピーして、SignTool で使用してアーティファクトに署名できるようにします。

新しい証明書署名リクエストを作成する

Cloud HSM 署名鍵の証明書署名リクエスト(CSR)を生成できます。認証局がコード署名用の新しい証明書を生成する際に CSR を必要とする場合は、次の手順を行います。

Cloud Shell または独自のマシンを使用して、次のコマンドを実行します。

openssl req -new -subj '/CN=CERTIFICATE_NAME/' DIGEST_FLAG \
  -engine pkcs11 -keyform engine \
  -key pkcs11:id=KEY_ID > REQUEST_NAME.csr

以下を置き換えます。

  • CERTIFICATE_NAME: 生成する証明書の名前。
  • DIGEST_FLAG: ダイジェストのタイプを示すフラグ。鍵のアルゴリズムに応じて、-sha256-sha384-sha512 を使用します。
  • KEY_ID: 非対称署名鍵バージョンの完全修飾リソース ID(例: projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1)。
  • REQUEST_NAME: 証明書署名リクエストの名前。

使用している鍵のタイプに適した -sigopt オプションを使用してください。

OpenSSL では、100 文字を超えるオブジェクト ID は使用できません。KeyRingCryptoKey の短い名前を使用するか、代わりに pkcs11:object=KEY_NAME を使用してください。OpenSSL オブジェクト ID の上限の詳細については、GitHub の関連する問題をご覧ください。

CSR が作成されたので、それを認証局(CA)に提供して署名証明書を取得できます。次のセクションで CA から提供された証明書を使用します。

SignTool を使用してアーティファクトに署名する

証明書が正常に作成され(自己署名証明書または認証局から取得済み)、Windows マシンにコピーされました。この証明書を使用して Windows アーティファクトに署名できます。

Cloud KMS 鍵と証明書を使用して、SignTool でアーティファクトに署名します。

"PATH_TO_SIGNTOOL.EXE" sign ^
  /v /debug /fd sha256 /t http://timestamp.digicert.com ^
  /f PATH_TO_CA.CERT ^
  /csp "Google Cloud KMS Provider" ^
  /kc projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1 ^
  PATH_TO_ARTIFACT_TO_SIGN

以下を置き換えます。

  • PATH_TO_SIGNTOOL.EXE: signtool.exe へのパス(例:C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.19041.0\\x64\\signtool.exe)を指定できます。
  • PATH_TO_CA.CERT: 証明書のパス ca.cert
  • PATH_TO_ARTIFACT_TO_SIGN: 署名するアーティファクトへのパス。

各コマンド オプションとサポートされているアーティファクト ファイル形式の詳細については、公式の SignTool ドキュメントをご覧ください。