SignTool:无法签署 XLSM (DOCM)

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

我对 Microsoft SignTool.exe 有一个小问题。 我已经安装了 Windows 10 SDK 并且 办公室 SIP 支持

macro enabled documents
。然后我按照
readme
激活
dlls
并进行了所有更改,包括:

  1. 已安装 - Microsoft Visual C++ 运行时库
  2. 设置VBE7.DLL的路径

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VBA]

"Vbe71DllPath"="C:\Workspace\Signing\vbe7.dll"

  1. 已注册
    MSOSIPX.DLL
    REGSVR32
  2. 我还创建了
    wintrust.dll.ini
    并添加:

[1]
DLL=
GUID={6E64D5BD-CEB0-4B66-B4A0-15AC71775C48}
CryptSIPDllCreateIndirectData=_VBASipCreateIndirectData@12
CryptSIPDllGetSignedDataMsg=_VBASipGetSignedDataMsg@20
CryptSIPDllIsMyFileType2=_VBASipIsMyTypeOfFileName@8
CryptSIPDllPutSignedDataMsg=_VBASipPutSignedDataMsg@20
CryptSIPDllRemoveSignedDataMsg=_VBASipRemoveSignedDataMsg@8
CryptSIPDllVerifyIndirectData=_VBASipVerifyIndirectData@8

  1. 我正在使用:

    signtool sign /debug /n "Cert" /fd SHA256 test.xlsm
    并发生以下情况:

SignTool 错误:无法识别此文件格式,因为它无法识别。
SignTool 错误:尝试签名时发生错误:test.xlsm
成功签名的文件数量:0
警告次数:0
错误数量:1


最后的小提示:

使用 test.exe 它工作得很好。

vba code-signing code-signing-certificate signtool xlsm
5个回答
2
投票

我知道这个问题已经得到解答,但请为遇到此问题的其他人添加我的意见。

我认为 SIP 模块的路径不需要尖括号。根据Wikipedia,语法是 key = value。所以我会用:

[1]
DLL=C:\Workspace\Signing\msosipx.dll

还要确保您使用的是

"C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x86"
中的 32 位版本的signtool。使用 64 位版本我收到了与您相同的错误。但是按照捆绑的
offsign.bat
中的示例并使用正确的版本使其可以工作。


1
投票

我已经通过使用

regsvr32.exe
通过
powershell
而不是
cmd
解决了这个问题。

重要提示!我正在工作文件夹

regsvr32.exe
中的
msosipx.dll
上拨打
C:\Workspace\Signing

附注我真的不明白为什么它会起作用。


0
投票

即使在我注册了 dll 之后,我也遇到了同样的错误

This file format cannot be signed because it is not recognized

然后我注意到我已经从未提升的cmd运行了

regsvr32
(我的开发机器上有UAC处于活动状态)。

即使它报告成功,当我重新运行时:

regsvr32 msosip.dll
regsvr32 msosipx.dll

从管理员cmd,确保我使用的是x86版本的signtool,然后我的

xlam
文件的签名成功:

C:\Program Files (x86)\Windows Kits\10\bin\10.0.18362.0\x86\signtool.exe" sign /v  /s My /n "Martin-Self-Office1" /fd SHA256 /tr http://timestamp.digicert.com /td SHA256 ".\f\Test-1-Addin.xlam"
...
Successfully signed: .\f\Test-1-Addin.xlam

Number of files successfully Signed: 1

0
投票

自 2023 年 6 月 1 日起,所有新代码签名证书(包括 OV)都需要使用 HSM [0] [1] 存储。 Microsoft 的 SignTool 不能与基于云的 HSM(例如 Azure Key Vault 的 Premium SKU)一起使用,而后者是满足 HSM 要求的流行选项。如果您在 2023 年 6 月 1 日之后遇到此问题,支持使用基于云的 HSM 证书演唱

xlsm
的替代方案是使用 AzureSignTool。我在here添加了一个答案,详细说明了此过程的工作原理:

可以使用 Azure Sign Tool 以及 Azure HSM 支持的代码签名证书,通过 VBA 宏对 Office 文件进行签名。

请按照以下步骤操作:

  1. 根据随附的自述文件安装 Office 主题接口包/SIPs。它可能看起来有点复杂/麻烦。请务必仔细阅读。

    • SIP 是一种扩展文件类型的方法,Authenticode 可以理解如何签名和验证。 (来源
    • Office SIP 仅限 x86/32 位。当从 64 位进程使用 Windows 的签名基础设施时,它们将不可用。因此,我们需要确保以 32 位执行 AzureSignTool。
  2. 在 shell 中执行

    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
    
  3. 验证一切正常:

    signtool verify /pa D:\signtest.xlsm

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

0
投票

我创建了一个详细视频,介绍如何修复此文件格式无法签名,因为在 VBA 宏的 Signtool 中无法识别错误

https://www.youtube.com/watch?v=2MQPGxWWHhE&ab_channel=PKI404

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