Jsign と PKCS#11 を使用して Windows アーティファクトに署名する

このガイドでは、PKCS#11 と Jsign を使用して Microsoft Authenticode に署名するための Cloud HSM 鍵を作成する手順について説明します。

ユースケース

このドキュメントで概要を説明するワークフローは、次のようなエンタープライズ セキュリティのニーズに対応しています。

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

始める前に

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

  • 署名するアーティファクトを含む Windows マシン。このマシンに Java がインストールされていることを確認します。
  • Cloud Shell または独自の Linux マシンで、証明書署名リクエストまたは証明書を生成します。このマシンで、OpenSSL のセットアップに記載されている構成を完了します。

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

Windows マシンで、最新の Jsign リリース JAR ファイルを、次の powershell コマンドを使用してダウンロードします。

wget https://github.com/ebourg/jsign/releases/download/JSIGN.VERSION/jsign-JSIGN.VERSION.jar -O jsign.jar

構成

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 マシンにコピーして、Jsign でアーティファクトに署名できるようにします。

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

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 オプションを使用してください。

Jsign でアーティファクトに署名する

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

サポートされているファイル形式のリストを表示するには、jsign --help コマンドを実行します。

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

java -jar PATH_TO_JSIGN.JAR --storetype GOOGLECLOUD \
  --storepass $(gcloud auth application-default print-access-token) \
  --keystore projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING \
  --alias KEY_NAME \
  --certfile PATH_TO_CA.CERT
  PATH_TO_ARTIFACT_TO_SIGN

以下を置き換えます。

  • PATH_TO_JSIGN.JAR: jsign.jar へのパス。
  • PATH_TO_CA.CERT: 証明書 ca.cert へのパス。
  • PATH_TO_ARTIFACT_TO_SIGN: 署名するアーティファクトへのパス。

各コマンド オプションの詳細については、公式の Jsign ドキュメントをご覧ください。