android 签名 时间戳,signtool签名时间戳失败的解决方法

本文详细讲述了作者在Windows 7上打包程序时遇到的签名时间戳失败问题,通过排查和更换不同版本的signtool.exe最终发现VS2013工具默认使用Windows SDK 8.1的signtool导致问题。解决方法是切换到与VS2013更匹配的8.1版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:梁敏

之前在win7上打包windows程序版本时,偶尔会遇到签名时间戳会失败的场景。之前解决方法一般是多试一次,或者尝试换一个时间戳服务器就可以了。

最近版本提测上线,在使用win7打包版本时,总是签名时间戳失败了,几乎是每次都不行。但是尝试替换各种服务器,还是不行。另外使用wosigncode.exe的工具,使用相同的时间戳服务器,都是可以成功的。说明不是时间戳服务器的问题。记得之前的项目打包时,也有在win7下有时候签名时间失败的,在win10上是ok的。之前所在团队还专门找了一台win10用来打包,同时自己也是用的是win10系统,所以也没有深入了解当时的原因。现在的项目打包在win7上也出现了签名时间戳失败的情况,之前是偶尔,最近是必现了。但是最近版本上线,为此升级win10来不及,还比较耗时。还是耐心的看看有没有什么解决办法吧,给自己半天时间看能否解决。

签名时间戳的命令如下:

signtool sign /f MyCert.pfx /t http://timestamp.verisign.com/scripts/timstamp.dll MyFile.exe

或者

signtool timestamp /t http://timestamp.verisign.com/scripts/timstamp.dll MyFile.exe

运行后报错如下:

SignTool Error: An error occurred while attempting to timestamp: MyFile.exe

SignTool Error: An unexpected internal error has occurred.

Error information: "SignerTimeStamp() failed." (-2147024895/0x80070001)

官方有提到这里的错误码0x800*****,和我这个类似,如下:

24978aa4e760094e6be5c4391b0cb303.png

但是没有对我遇到的这个错误码0x80070001的问题说明。那就搜这个错误码有没有相关的案例:“signtool 0x80070001”,但是遇到同样错误码的几乎没有。google大法,各种搜索,SignerTimeStamp() failed,SignTool Error。寻求到的解决方案,有说管理员身份运行,有说时间戳服务器换一换,有说...。不过,都不行。

后来,转变思路,在C盘搜了一下本机的signtool.exe,

C:\Program Files (x86)\Windows Kits\8.0\bin\x86

C:\Program Files (x86)\Windows Kits\8.1\bin\x86

C:\Program Files (x86)\Windows Kits\10\bin\x86

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin

搜索了下,拿来替换到我们项目里之前保存的signtool.exe试一试吧。

在逐一替换了之后,发现使用C:\Program Files (x86)\Windows Kits\8.1\bin\x86下的signtool.exe打包总是成功的。查看我们项目里的打包单独引用的signtool.exe是windows Kits的10.0版本的,这也就说明了之前项目在win10上签名成功,win7容易失败。而我现在使用的是vs2013在win7上生成的程序,使用8.1低版本的更匹配。

我们项目使用的是VS2013,接下来使用VS2013的Visual Studio Tools下的VS2013 x86 本机工具命令提示工具,输入signtool命令操作,发现也是成功。

1227b7709f8c9af3540544e0818cab81.png

那接下来看看VS2013工具使用的是哪个版本路径下的signtool吧。在

C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\路径下的VCVarsQueryRegistry.bat文件,写明了工具窗口调用的windowsSDK的路径:

5f773a4fc976c3da99f29d601f4ec032.png

从脚本中得知,是从注册表中获取windowsSDK 8.1的安装路径,那也就是说VS2013工具是使用C:\Program Files (x86)\Windows Kits\8.1\bin\x86路径下的signtool.exe的。那我们也用这个签名时间戳应该没问题了,把该文件拷贝到我们项目后验证是可以正常使用了。顺便看了下,VS2015的工具在没有指定的情况下,是优先使用WindowsSDK 10,没有安装10会使用WindowsSDK 8.1版本的。

9ff73a2b3cf17d9e62ca8c897fa17de6.png

好了,问题解决了,原来最后解决方法如此简单低级。不过,貌似工作中解决的非必现、各种疑难问题,其背后都是一些低级的简单的方法,重要的是问题解决了,以及过程中分析解决问题的思路,不是吗?

以此记录下最近遇到的签名时间戳失败的解决方法。有描述不准确的地方,欢迎大家指正~

本文来自网易实践者社区,经作者梁敏授权发布

签名工具 (SignTool.exe) 签名工具是一个命令行工具,用于对文件进行数字签名,验证文件或时间戳文件中的签名。 注意 Microsoft Windows NT、Windows Me、Windows 98 或 Windows 95 中不支持签名工具。 signtool [command] [options] [file_name | ...] 参数 参数 说明 command 命令标志之一,用于指定要对文件执行的操作。 options 用于修改命令标志的选项标志之一。 file_name 要进行签名的文件的路径。 签名工具支持下列命令。 命令 说明 catdb 在目录数据库中添加或移除目录文件。 sign 对文件进行数字签名。 signwizard 启动签名向导。只能为文件名命令行参数指定一个文件。 timestamp 时间戳文件。 verify 验证文件的数字签名。 下列选项应用于 catdb命令。 Catdb 选项 说明 /d 指定更新默认目录数据库。如果 /d和 /g 选项都未使用,则签名工具更新系统组件和驱动程序数据库。 /g GUID 指定更新由全局唯一标识符 (GUID) 标识的目录数据库。 /r 从目录数据库中移除指定的目录。如果未指定该选项,签名工具将向目录数据库添加指定的目录。 /u 指定为添加的目录文件自动生成唯一的名称。如有必要,将重命名目录文件,以避免与现有的目录文件发生冲突。如果未指定该选项,签名工具将重写与所添加的目录同名的任何现有目录。 注意 目录数据库用于自动查找目录文件。 下列选项适用于sign命令。 Sign 选项 说明 /a 自动选择最佳的签名证书。如果未指定该选项,签名工具仅查找一个有效的签名证书。 /c CertTemplateName 指定用于对证书进行签名的证书模板名(一个 Microsoft 扩展)。 /csp CSPName 指定包含私钥容器的加密服务提供程序 (CSP)。 /d Desc 指定已签名内容的说明。 /du URL 指定已签名内容的更详细说明的统一资源定位器 (URL)。 /f SignCertFile 指定文件中的签名证书。如果文件是个人信息交换 (PFX) 格式且受密码保护,则使用 /p 选项来指定密码。如果文件不包含私钥,则使用 /csp 和 /k 选项来分别指定 CSP 和私钥容器名。 /i IssuerName 指定签名证书的颁发者的名称。该值可以是整个颁发者名称的子字符串。 /k PrivKeyContainerName 指定私钥容器名。 /n SubjectName 指定签名证书的主体的名称。该值可以是整个主体名称的子字符串。 /p 密码 指定打开 PFX 文件时使用的密码。可以通过使用 /f 选项来指定 PFX 文件。 /r RootSubjectName 指定签名证书必须链接到的根证书的主体名称。该值可以是根证书的整个主题名称的子字符串。 /s StoreName 指定要在搜索证书时打开的存储区。如果未指定该选项,则打开“我的存储区”。 /sha1 哈希 指定签名证书的 SHA1 哈希。 /sm 指定使用一个计算机存储区,而不是使用用户存储区。 /t URL 指定时间戳服务器的 URL。如果该选项不存在,将不会对签名文件执行时间戳操作。如果时间戳操作失败,将生成一个警告。 /u 用法 指定签名证书中必须存在的增强型密钥用法 (EKU)。可以通过 OID 或字符串指定该用法的值。默认用法为“代码签名”(1.3.6.1.5.5.7.3.3)。 下列选项适用于 timestamp 命令。 Timestamp 选项 说明 /t URL 必选。指定时间戳服务器的 URL。要执行时间戳操作的文件必须在以前已经进行了签名。 下列选项适用于 verify 命令。 Sign 选项 说明 /a 指定可以使用所有方法来验证文件。首先,搜索目录数据库以确定是否在目录中对文件进行了签名。如果未在任何目录中对文件进行签名签名工具将尝试验证文件的嵌入签名。验证可以或不能在目录中进行签名的文件时,建议使用该选项。可以或不能签名的文件示例包括 Windows 文件或驱动程序。 /ad 使用默认的目录数据库查找目录。 /as 使用系统组件(驱动程序)目录数据库查找目录。 /ag CatDBGUID 在由 GUID 标识的目录数据库中查找目录。 /c CatFile 通过名称指定目录文件。 /o Version 通过操作系统版本验证文件。version 参数的格式为 PlatformID:VerMajor.VerMinor.BuildNumber /pa 指定使用默认的身份验证策略。如果未指定 /pa 选项,签名工具将使用 Windows 驱动程序验证策略。此选项不能与 catdb 选项一起使用。 /pg PolicyGUID 通过 GUID 指定验证策略。GUID 对应于验证策略的 ActionID。此选项不能与 catdb 选项一起使用。 /r RootSubjectName 指定签名证书必须链接到的根证书的主体名称。该值可以是根证书的整个主题名称的子字符串。 /tw 指定如果签名没有时间戳,则生成一个警告。 下列选项适用于所有签名工具命令。 全局选项 说明 /q 执行成功时不生成输出,执行失败时生成最少的输出。 /v 执行成功、执行失败或产生警告消息时生成详细输出。 备注 签名工具要求本地计算机上安装了 CAPICOM 2.0 可再发行程序。可以从 http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdkredist.htm 获得 CAPICOM 2.0 可再发行程序。 签名工具的 verify 命令确定签名证书是否由受信任的颁发机构颁发、是否已撤消了签名证书,以及签名证书对于特定策略是否有效(此项可选)。 执行成功时,签名工具返回退出代码 0;执行失败时,签名工具返回退出代码 1;执行完毕并给出警告时,签名证书返回退出代码 2。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值