【问题标题】:Sign HLKX package with key stored in HSM使用存储在 HSM 中的密钥对 HLKX 包进行签名
【发布时间】:2022-08-17 19:46:04
【问题描述】:

我需要使用存储在 HSM 中的证书/密钥对使用 Hardware Lab Kit 创建的 HLKX 包进行签名。我确实将证书作为文件保存,但它仅包含公钥,而私钥存储在 HSM 中,该 HSM 未连接到包需要登录的计算机。

使用此处代码示例中提供的 Sign 函数: https://docs.microsoft.com/en-us/windows-hardware/test/hlk/user/hlk-signing-with-an-hsm 我得到了例外: System.Security.Cryptography.CryptographicException: \'找不到选定的数字证书。\'

我认为这是因为它没有属于可用证书的私钥。有一些关于提供实际签名功能的 CSP dll 的模糊信息,但我可以找到有关其接口外观的任何信息 - 以及如何告诉系统该 CSP dll 负责哪些证书。此外,HSM 连接到 Hashicorp Vault 并且不直接使用。

如果使用 signtool.exe 对二进制文件进行签名,很容易在一次调用中创建摘要,然后在自定义代码中使用该摘要来获取签名并再次调用 signtool.exe 以实际添加签名。但是我不清楚在签署 HLKX 包时这是如何完成的。是否有任何(有用的)文档或代码示例说明如何实现这一目标?

    标签: windows certificate driver signing hsm


    【解决方案1】:

    以下是签名的工作原理:

    1. 以某种方式获取二进制文件。例如,从源代码构建。可以是任何东西,但它的格式很重要。
    2. 计算二进制的哈希值
    3. 使用 RSA 等非对称算法计算哈希的数字签名。这一步需要什么直接访问私钥(不是公钥也不是持有它的证书)。
    4. 嵌入正确二进制格式的签名,通常还有二进制文件中的哈希和证书。

      步骤 1 和 2 是众所周知的。第 3 步和第 4 步变得复杂。

      如果您的私钥在 HSM 中,只有 HSM 可以执行第 3 步: 对哈希签名。

      Hashicorp Vault(企业版)连接到 HSM 的事实并没有帮助,因为 Vault 不提供可以执行第 4 步的秘密引擎。Vault 不知道如何在 HLK 二进制文件中插入签名。更糟糕的是,截至 2022 年 7 月,Vault 不提供使用存储在 HSM 中的私钥对任意散列进行签名的方法。

      长话短说:您不能将 Vault 用于您的用例。

      由于只有 HSM 可以访问私钥,因此 HSM 将执行实际签名。它永远不会泄露私钥,只会将结果返回给调用者。无论什么叫做 HSM 都必须在包中插入签名,尊重格式。

      使用signtool.exe 是不可能的,因为它不支持Open Packaging Conventions standard。但它会帮助您调试配置。

      我会将问题分解为以下步骤:

      使 HSM 与 Windows 一起工作。

      阅读您的 HSM 供应商文档,以便安装并配置您的 HSM 的 DLL 以作为第一类 Windows 加密服务提供程序工作。它可以是插入工作站的智能卡或联网的 HSM(通过专有协议,请注意您和它之间的防火墙)。

      在您的证书存储中导入您的签名证书

      使用 The Hardware Lab Kit 对您的 .hlkx 包进行签名,您必须选择“使用证书存储”选项。 “证书文件”选项意味着您拥有私钥,但您没有。 HSM 拥有它,它永远不会导出它。

      因此,要使该选项起作用,证书必须在您的证书存储中。检查您的供应商文档以确保您导入证书的方式告诉证书存储私钥由 HSM 持有。

      一些示例让您提供证书文件,但我怀疑它只是提取其哈希并在证书存储中查找它。

      测试你的配置

      此时,您需要一名裁判。当您的代码中的一个讨厌的错误是真正的罪魁祸首时,您不想调试您的 HSM 配置。因此,运行 signtool 来签署任何旧的二进制文件。如果您愿意,可以签名notepad.exe

      copy %windir%\system32\notepad.exe .\my-notepad.exe
      signtool sign /f certificate.cer /csp "Hardware Cryptography Module" my-notepad.exe
      

      Hardware Cryptography Module 替换为 HSM 的 CSP 名称。请检查您的供应商文档。

      运行代码

      有一个示例 C# 程序将使用 HSM 进行签名。您必须提供 CSP 的名称,它与您在使用 signtool.exe 进行测试时提供的名称相同。

    【讨论】:

    • 感谢您提供信息,但正如我在问题中暗示的那样,在系统上使用 HSM(即使用 HSM CSP dll)是不可能的。由于评论太长,让我在单独的帖子中详细说明架构。
    • 我们拥有连接到 Hashicorp Vault 服务器的 HSM 硬件,该服务器要求用户(通过 Azure 令牌)登录到特定角色,Vault 使用该角色来确定是否允许用户使用 HSM 中的某个密钥。我们有一个处理与 Vault 通信的 Go 应用程序,因此,我可以将哈希传递给与 Vault 通信并返回签名的应用程序。对 HSM 进行签名的实际调用是在 Vault 服务器上完成的(在插件中)。
    • 例如,签署可执行文件是使用 signtool.exe 完成的,分三个步骤(步骤 1 中的证书仅作为文件提供): 1. signtool.exe sign /dg <my_directory> /f <my_cert> ... 2. 使用自定义将步骤 1 中的摘要发送到 Vault 服务器并对其进行签名的工具 3. signtool.exe sign /di <my_directory> <file_with_signature> 无法直接使用 HSM,因为签名中不应该存在对 HSM 的登录工作站(因此 Hashicorp Vault 服务器是“签名提供者”)。
    • 听起来(缺少使用 HSM CSP dll 的选项)我需要以指向自定义 CSP dll(它将与 Vault 服务器进行签名)的方式将证书导入区域设置证书存储。但是我找不到有关如何将某个证书映射到自定义 CSP dll 以及该 dll 应该提供什么样的接口的信息。对一个名为 AuthenticodeDigestSign 的函数有一些模糊的引用,它可能需要导出,但即便如此,我也找不到有关提供哪种参数或它应该返回什么的信息。
    • 重新...有关如何将某个证书映射到自定义 CSP dll 的信息... >> 请参阅 certutil“repairstore”选项。在 HSM 中生成密钥,使用普通工具发布 CSR,对该 CSR 进行签名,将证书导入签名主机,确保供应商的 CSP dll 可用,然后“修复存储”证书。该工具读取证书,查找 CSP,然后验证 CSP 是否有权访问参考私钥。
    【解决方案2】:

    为了使用此处描述的 PackageDigitalSignatureManager 方法: https://docs.microsoft.com/en-us/windows-hardware/test/hlk/user/hlk-signing-with-an-hsm 需要解决两个先决条件:

    1. 需要创建和注册加密服务提供程序 dll
    2. 需要将证书导入证书存储并链接到提供程序。

      关于1: 有一个示例项目(在 C++ 中创建一个提供程序 dll 和一个处理 dll 注册/注销的命令行可执行文件)。要以这种方式进行注册,DLL 必须存在于 Windows\System 文件夹中。 源示例可以在这里找到: https://www.microsoft.com/en-us/download/details.aspx?id=30688

      关于2: 我找到了一种将证书与提供者链接的方法,并在我的另一个问题中发布了 C# 代码: How to link KSP DLL to Certificate

      评论: 这样做适用于从 Hardware Lab Kit 软件中对 hlkx 文件进行签名,或者通过使用 PackageDigitalSignatureManager 类手动签名,如上面链接的示例中所述。对我来说,在使用 Microsoft 的 signtool.exe 签署可执行文件时尝试使用证书时,它(还)不起作用。它总是抱怨证书的私钥不可用,尽管商店中的证书也声明私钥可用。但是当我专注于 hlkx 签名时,我还没有研究这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-20
      • 2018-07-03
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      相关资源
      最近更新 更多