signtool 无法使用来自 AWS CloudHSM 的密钥对二进制文件进行签名

too*_*tik 6 code-signing certificate hsm amazon-web-services signtool

我们将使用 AWS CloudHSM 服务来确保所有代码签名证书的安全并在我们的构建服务器上执行代码签名。我们的构建服务器是 Windows Server 2010,所以我在那里安装了 AWS CloudHSM 客户端。我激活了集群,所有命令行工具都按预期工作:我可以登录、添加密钥、查找密钥等。我们想继续使用 signtool 来签署我们的二进制文件,所以我认为我们可以使用密钥存储提供程序 (KSP)对于 AWS CloudHSM,与其他工具一起安装。

Cavium KSP 和 CNG 提供程序已成功安装,并且在 Windows 加密提供程序的列表中可见。我在这里定义了环境变量(https://docs.aws.amazon.com/cloudhsm/latest/userguide/ksp-library-prereq.html)。

我通过 certutil 添加了证书到 HSM 存储:

Certutil -CSP "Cavium Key Storage Provider" -user -importPFX  "certificate.pfx"
SDK Version: 2.03
Enter PFX password:
Certificate "myCertificate" added to store.

CertUtil: -importPFX command completed successfully.
Run Code Online (Sandbox Code Playgroud)

证书已成功添加,当我从 key_mgmt_util.exe 控制台执行 findKey 命令时出现。

之后,我尝试使用证书对二进制文件进行签名,如https://docs.microsoft.com/en-us/windows-hardware/test/hlk/user/hlk-signing-with-an-hsm 中所述:

signtool_64 sign /n myCertificate "test.exe"
Run Code Online (Sandbox Code Playgroud)

或者

signtool sign /sha1 4F555EF9FAB8E86A2F84ACF325362A29FB64AF66 "test.exe"
Run Code Online (Sandbox Code Playgroud)

但我遇到了一个无法解决的错误

    SDK Version: 2.03
    Done Adding Additional Store
    SignTool Error: An error occurred while attempting to load the signing
    certificate from: C:\temp\test.exe
Run Code Online (Sandbox Code Playgroud)

我还尝试指定密钥存储提供程序和密钥容器

signtool sign /csp "Cavium Key Storage Provider" /k CARoot-877f51a1-90ee-4c10-8feb-02925caab4fb test.exe
Run Code Online (Sandbox Code Playgroud)

回到我身边

SignTool Error: An unexpected internal error has occurred.
Error information: "Could not associate private key with certificate." (-2147024
891/0x80070005)
Run Code Online (Sandbox Code Playgroud)

signtool sign /f certificate.pem /csp "Cavium Key Storage Provider"
/k CARoot-877f51a1-90ee-4c10-8feb-02925caab4fb test.exe
Run Code Online (Sandbox Code Playgroud)

与其他错误信息

SignTool Error: The specified private key does not match the public key of the selected certificate.
Run Code Online (Sandbox Code Playgroud)

在我看来,存储中的证书有问题,但我不知道如何解决这个问题。test.exe 存在于磁盘上,可以使用来自其他提供商的证书或在指定 pfx 文件时使用 signtool 进行签名。

我究竟做错了什么?Amazon CloudHSM 客户端是否与 signtool 兼容,或者我如何使用 Amazon CloudHSM 作为密钥存储在 Windows 上签署二进制文件?

小智 2

我刚刚撰写了文章使用 AWS CloudHSM 支持的证书通过 Microsoft SignTool.exe 对可执行文件进行签名,该文章涵盖了此场景。

总结一下:

  • 您需要确保拥有 CloudHSM 的最新二进制文件。

  • 检查在创建证书时(如果您自签名)是否已创建 Windows 中的相关密钥容器。

  • 如果需要,运行 certutil -repairstore。
  • 使用 SignTool 时,请检查您是否指定了证书 HASH


如果您需要进一步帮助,请一如既往地联系 AWS Support 或查看 AWS 论坛。