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

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

ユースケース

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

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

始める前に

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

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

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

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

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

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

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 ドキュメントをご覧ください。