SignTool在TeamCity CI中偶发无法识别文件格式签名失败问题咨询
signtool间歇性签名失败问题诱因及解决方案
问题核心特征
CI环境下signtool签名偶发失败,后续所有构建均返回相同错误,重启机器恢复,手动执行相同命令签名正常,报错如下:
[09:04:00][Exec] C:\TeamCity\buildAgent\work\f1f2a8269bd3cd0e\MyProject.Setup.AllUsers\..\SigningTool\signtool.exe sign /f C:\TeamCity\buildAgent\work\f1f2a8269bd3cd0e\MyProject.Setup.AllUsers\..\Certificate\MyCompany.p12 /d "MyCompany" /p MyPassword! /v /tr http://sha256timestamp.ws.symantec.com/sha256/timestamp /td SHA256 C:\TeamCity\buildAgent\work\f1f2a8269bd3cd0e\MyProject.Setup.AllUsers\bin\Debug\MyProject.msi [09:04:00][Exec] The following certificate was selected: [09:04:00][Exec] Issued to: MyCompany [09:04:00][Exec] [09:04:00][Exec] Issued by: Sectigo RSA Code Signing CA [09:04:00][Exec] [09:04:00][Exec] Expires: Wed Apr 27 23:59:59 2022 [09:04:00][Exec] [09:04:00][Exec] SHA1 hash: *** [09:04:00][Exec] [09:04:00][Exec] [09:04:00][Exec] Done Adding Additional Store [09:04:00][Exec] [09:04:00][Exec] Number of files successfully Signed: 0 [09:04:00][Exec] [09:04:00][Exec] Number of warnings: 0 [09:04:00][Exec] [09:04:00][Exec] Number of errors: 1 [09:04:00][Exec] [09:04:00][Exec] EXEC This file format cannot be signed because it is not recognized. [09:04:00][Exec] EXEC An error occurred while attempting to sign: C:\TeamCity\buildAgent\work\f1f2a8269bd3cd0e\MyProject.Setup.AllUsers\bin\Debug\MyProject.msi [09:04:00][Exec] [09:04:00][Exec] C:\TeamCity\buildAgent\work\f1f2a8269bd3cd0e\packages\WiX.3.11.2\tools\wix2010.targets(2832, 5): error MSB3073: The command "C:\TeamCity\buildAgent\work\f1f2a8269bd3cd0e\MyProject.Setup.AllUsers\..\SigningTool\signtool.exe sign /f C:\TeamCity\buildAgent\work\f1f2a8269bd3cd0e\MyProject.Setup.AllUsers\..\Certificate\MyCompany.p12 /d "MyCompany" /p MyPassword! /v /tr http://sha256timestamp.ws.symantec.com/sha256/timestamp /td SHA256 C:\TeamCity\buildAgent\work\f1f2a8269bd3cd0e\MyProject.Setup.AllUsers\bin\Debug\MyProject.msi" exited with code 1.
当前使用signtool版本为10.0.17763.132
问题诱因
- Session 0会话句柄泄漏:TeamCity构建代理运行在后台服务专属的Session 0上下文,若前序构建任务异常终止,会持有待签名MSI/EXE的独占句柄,signtool无法正常读取文件内容时,会抛出格式不识别的错误。手动执行命令时处于用户交互会话,和后台服务会话的句柄空间隔离,因此可以正常签名。
- 旧版signtool已知缺陷:10.0.17763版本的signtool存在加密上下文泄漏问题,连续多次执行签名操作后,内部证书解析、格式识别逻辑会进入异常状态,该状态会残留在当前会话环境中,导致后续所有签名请求均失败,只有重启系统释放会话资源才能恢复。
- 时间戳服务异常连带报错:旧版signtool的错误捕获逻辑存在问题,当时间戳服务请求超时、返回异常时,会错误抛出“文件格式不识别”的报错,而非时间戳相关错误,且异常状态会被复用导致后续签名持续失败。
解决方案
临时修复方案(无需重启整机)
- 构建失败后,重启TeamCity构建代理服务即可清除Session 0中的残留异常状态和泄漏句柄,恢复签名能力。
- 在签名步骤前增加重试逻辑,最多重试3-5次,每次间隔2秒,可过滤偶发的时间戳异常导致的单次签名失败。
- 签名前增加文件占用检测步骤,调用
handle.exe工具强制关闭持有待签名文件句柄的异常进程。
根治方案
- 升级signtool版本:替换为Windows SDK 10.0.19041及以上版本自带的signtool,该版本已修复加密上下文泄漏的已知缺陷,不会出现异常状态残留问题。
- 独立进程执行签名:将签名步骤单独放在独立的临时进程中执行,每次签名完成后直接销毁进程,避免异常状态泄漏到后续构建任务。
- 更换稳定时间戳服务,降低时间戳异常概率。
内容的提问来源于stack exchange,提问作者Alexey Andrushkevich
相关产品推荐
相关产品推荐

