本指南介绍了如何通过 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 认证,请完成以下步骤:
在 Google Cloud 控制台中,前往密钥管理页面。
选择包含您要证明的密钥的密钥环,然后选择密钥。
对于要证明的密钥版本,点击更多 more_vert,然后点击验证证明。
在验证证明对话框中,点击下载证明包。 此操作会下载包含证明和证书的 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.JAR
:jsign.jar
的路径。PATH_TO_CA.CERT
:证书ca.cert
的路径。PATH_TO_ARTIFACT_TO_SIGN
:指向 Cloud Storage 存储分区的 签名。
如需详细了解每个命令选项,请参阅官方 Jsign 文档。