我对 Microsoft SignTool.exe 有一个小问题。 我已经安装了 Windows 10 SDK 并且 办公室 SIP 支持
macro enabled documents
。然后我按照readme
激活dlls
并进行了所有更改,包括:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VBA]
"Vbe71DllPath"="C:\Workspace\Signing\vbe7.dll"
MSOSIPX.DLL
与 REGSVR32
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
我正在使用:
signtool sign /debug /n "Cert" /fd SHA256 test.xlsm
并发生以下情况:
SignTool 错误:无法识别此文件格式,因为它无法识别。
SignTool 错误:尝试签名时发生错误:test.xlsm
成功签名的文件数量:0
警告次数:0
错误数量:1
最后的小提示:
使用 test.exe 它工作得很好。
我知道这个问题已经得到解答,但请为遇到此问题的其他人添加我的意见。
我认为 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
中的示例并使用正确的版本使其可以工作。
我已经通过使用
regsvr32.exe
通过powershell
而不是cmd
解决了这个问题。
重要提示!我正在工作文件夹
regsvr32.exe
中的msosipx.dll
上拨打C:\Workspace\Signing
。
附注我真的不明白为什么它会起作用。
即使在我注册了 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
自 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 文件进行签名。
请按照以下步骤操作:
根据随附的自述文件安装 Office 主题接口包/SIPs。它可能看起来有点复杂/麻烦。请务必仔细阅读。
- SIP 是一种扩展文件类型的方法,Authenticode 可以理解如何签名和验证。 (来源)
- Office SIP 仅限 x86/32 位。当从 64 位进程使用 Windows 的签名基础设施时,它们将不可用。因此,我们需要确保以 32 位执行 AzureSignTool。
在 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
验证一切正常:
signtool verify /pa D:\signtest.xlsm
File: D:\signtest.xlsm Index Algorithm Timestamp ======================================== 0 sha256 RFC3161 Successfully verified: D:\signtest.xlsm
我创建了一个详细视频,介绍如何修复此文件格式无法签名,因为在 VBA 宏的 Signtool 中无法识别错误
https://www.youtube.com/watch?v=2MQPGxWWHhE&ab_channel=PKI404