使用 Jsign 和 PKCS#11 为 Windows 制品签名

本指南介绍了如何通过 PKCS#11 和 Jsign 创建 Cloud HSM 密钥,以便进行 Microsoft Authenticode 签名。

使用场景

本文档中介绍的工作流有助于解决以下 安全需求:

  • 使用受 FIPS140-2 3 级 HSM 保护的私钥为固件签名。
  • 无需使用 signtool 即可为 Windows 工件签名。

准备工作

如需完成本教程,您需要具备:

  • 包含您要签名的工件的 Windows 机器。确保此机器上已安装 Java。
  • Cloud Shell 或您自己的 Linux 机器, 来生成证书签名请求或证书。在这台机器上 完成 OpenSSL 设置中记录的配置。

如果您尚未运行 gcloud auth application-default login,请务必运行。

在 Windows 计算机上,使用以下 PowerShell 命令下载最新的 Jsign release JAR 文件:

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

配置

创建 Cloud KMS 托管的签名密钥

使用 Cloud Shell 或您自己的机器,创建 Cloud KMS 将密钥环添加到 Google Cloud 项目中:

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) 可能会要求您提供此证明,以便颁发扩展验证 (EV) 证书。

如需下载与您的 Cloud KMS 密钥关联的 HSM 认证,请完成以下步骤:

  1. 在 Google Cloud 控制台中,前往密钥管理页面。

    前往 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 密钥和 证书。

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.JARjsign.jar 的路径。
  • PATH_TO_CA.CERT:证书 ca.cert 的路径。
  • PATH_TO_ARTIFACT_TO_SIGN:指向 Cloud Storage 存储分区的 签名。

如需详细了解每个命令选项,请参阅官方 Jsign 文档