使用 Azure Key Vault (HSM) 签署 VBA(宏的内部 doc 和/或 docx)

问题描述 投票:0回答:2

我们有新的代码签名证书。这次是 GlobalSign 的 EV 代码签名证书。该证书现在仅在 Azure Key Vault 中以 RSA-HSM 形式提供。

我确实设法使用 AzureSignTool 对 dll 和可执行文件进行签名,我还问了这个问题

托多:

  • 在 Installshield professional 中使用 AzureSignTool,遗憾的是这是不可能的
  • 在 Wix 工具集中使用 AzureSignTool

这个问题:

  • 签署 VBA(宏在 doc 和/或 docx 内部)

在了解了 VBA 签名是什么之后,我发现对 VBA 文件进行签名实际上是由 SignedCms 完成的。查看 EPPlus 的源代码,我发现它就是这样做的。 除了我们没有直接的私钥外,Azure Key Vault 有。一段代码可以在访问密钥库时获取它,但只能获取 RSA 私钥。

也许这个问题是相关的?

dotnet/runtime#24707

它被实现到.net core 3.0及更高版本中

dotnet/corefx#29219

code-signing azure-keyvault
2个回答
2
投票

长话短说,您需要实现 CNG 接口来创建一个 KSP,该 KSP 执行客户端哈希、ASN.1 编码(因为它是 RSA 签名),然后将结果发送到 Azure 进行签名,同时将 RSNULL 指定为签名算法。或者,您可以使用第三方解决方案来为您完成这一切。我们使用

这个

,尽管可能还有其他的。


0
投票
Azure Sign Tool

以及 Azure HSM 支持的代码签名证书,通过 VBA 宏对 Office 文件进行签名。 请按照以下步骤操作:

    根据随附的自述文件安装
  1. Office 主题接口包/SIPs

    。它可能看起来有点复杂/麻烦。请务必仔细阅读。

    SIP
      是一种扩展文件类型的方法,Authenticode 可以理解如何签名和验证
    • 。 (来源 Office SIP 仅限 x86/32 位。当从 64 位进程使用 Windows 的签名基础设施时,它们将不可用。因此,我们需要确保以 32 位执行 AzureSignTool。
  2. 在 shell 中执行
  3. git clone https://github.com/vcsjones/AzureSignTool.git cd AzureSignTool/src/AzureSignTool dotnet run sign "D:\signtest.xlsm" -kvm -kvu https://contoso-codesigning.vault.azure.net/ -kvc contoso-codesigning-ov -tr http://timestamp.acs.microsoft.com/ -r win-x86 dotnet run sign "D:\signtest.xlsm" -kvm -kvu https://contoso-codesigning.vault.azure.net/ -kvc contoso-codesigning-ov -tr http://timestamp.acs.microsoft.com/ -r win-x86 dotnet run sign "D:\signtest.xlsm" -kvm -kvu https://contoso-codesigning.vault.azure.net/ -kvc contoso-codesigning-ov -tr http://timestamp.acs.microsoft.com/ -r win-x86

    如果您想使用服务主体和相应的客户端密钥进行身份验证,请将 
      -kvm
    • (
      -kvm|--azure-key-vault-managed-identity UseManagedIdentity
      ) 替换为
      -kvi <clientid> -kvs <clientsecret> -kvt <tenantid>
      实际上需要运行相同的命令3次,首先创建旧签名,然后创建敏捷签名,然后创建V3签名。请参阅 Office SIP 的自述文件。
    • 这应该输出类似的内容

    info: AzureSignTool.SignCommand[0] => File: D:\signtest.xlsm Signing file. info: AzureSignTool.SignCommand[0] => File: D:\signtest.xlsm Signing completed successfully. info: AzureSignTool.SignCommand[0] Successful operations: 1 info: AzureSignTool.SignCommand[0] Failed operations: 0

  4. 验证一切正常:
  5. signtool verify /pa D:\signtest.xlsm

    File: D:\signtest.xlsm
    Index  Algorithm  Timestamp
    ========================================
    0      sha256     RFC3161
    
    Successfully verified: D:\signtest.xlsm
    

    
        
© www.soinside.com 2019 - 2024. All rights reserved.