SignTool.exe 偶尔以退出代码1失败

10

作为我们构建系统的一部分,我们使用signtool.exe和证书对二进制文件进行签名。偶尔(很难确定什么时候会发生),签名会失败:

 error MSB3073: The command "C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\bin\signtool.exe" [...] exited with code 1.

根据MSDN的说法,退出代码为1意味着签名文件时出错。我可以确认该文件未被签名。

我还注意到即使文件仍然被签名(没有时间戳),有时时间戳部分也会超时并显示不同的错误消息。

如何排除和修复这些看似随机、不一致的签名失败问题?


我有同样的经验:在时间戳期间,signtool 偶尔会失败。似乎除了重新运行 signtool 外,没有其他解决办法。 - Eugene Mayevski 'Callback
@EugeneMayevski'EldoSCorp 一些人报告更新他们的Windows XP证书可以解决问题,还有其他一些奇怪的事情。我想要一个明确的答案,因为对我来说,构建失败非常严重。但我担心你是正确的。 - ashes999
1
假设您的时间戳服务器完全无法访问(网络电缆未连接等),那么signtool或其他用于相同目的的工具如何处理呢?当然,我希望signtool能够更加容错,并尝试再次执行时间戳操作,但是您必须准备好可能出现的时间戳失败情况。 - Eugene Mayevski 'Callback
也许解决这个问题的答案是在更高层面上解决,比如在持续集成服务器上。不过我仍然希望有一个更低层次的解决方案。 - ashes999
4个回答

5

我强烈怀疑与时间戳服务器的连接出现故障是偶发性故障的原因。也许你可以检查系统事件日志,查看是否在问题发生时失去了连接。


如果是这种情况,我该如何纠正呢?我无法控制时间戳服务器。 - ashes999
几乎什么都有可能。检查你的基础设施。我们曾经遇到过一次由于网络电缆故障引起的问题。那很容易解决。可能是由于维护而导致的局部停机时间,也可能与你的互联网提供商有关。我的建议(就像 Eugene Mayevski 'EldoS Corp 解释的那样):实现重试机制。不要让程序集签名成为你流程中的时间关键部分。 - The Chairman
你能否编辑你的答案并提到构建过程应该更加健壮?这就是我最终采取的措施。 - ashes999
哎呀,我的 signtool 版本在时间戳失败时没有给出失败的退出代码。事实上,它假装一切都很好,这是一个重大的烦恼。 - 0xC0000022L

2

我刚刚遇到了这个问题,在Windows 8.1上,所以这不是一些人引用的Windows XP根证书的问题。

我发现问题的原因是由于签名的.exe文件也在运行。

如果您从cmd提示符中运行signtool并尝试对其进行签名,则会收到有用的文本消息,告诉您出了什么问题(比CreateProcess()的返回代码1好多了)。

停止正在运行的进程,然后就能够成功签名了。


2

我曾经遇到过同样的问题。这是因为微软的反恶意软件进程MsMpEng.exe检查了二进制文件并阻止了任何人访问它。 为了解决这个问题,我在RAM磁盘上构建了二进制文件,然后它就能正常工作了。


1
在我的情况下,解决方案中的 .pfx 文件是旧的。直到有人告诉我用新的有效证书文件替换掉原来的,我才停止出现“退出代码1”的错误。
也就是说,请确保证书文件有效且未过期。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接