SignTool 的已知问题和故障排除

使用 SignTool 时最常见的错误类型是内部错误,通常如下所示:

SignTool Error: An unexpected internal error has occurred.
Error information: "Error: SignerSign() failed." (-2147024885 / 0x8007000B) 

如果错误代码以0x8008开头(例如0x80080206(APPX_E_CORRUPT_CONTENT),则正在签名的包无效。 如果收到此类错误,则必须重新生成包并再次运行 SignTool

SignTool 具有可用于显示证书错误和筛选的调试选项。 若要使用调试功能,请直接将 /debug 选项置于后面 sign,然后是完整的 SignTool 命令。

SignTool sign /debug [options]

更常见的错误是0x8007000B。 对于这种类型的错误,可以在事件日志中找到详细信息。

若要在事件日志中查找详细信息,请执行以下操作。

  • 运行 Eventvwr.msc
  • 打开事件日志:事件查看器(本地)-> 应用程序和服务日志 -> Microsoft -> Windows -> AppxPackagingOM -> Microsoft-Windows-AppxPackaging/Operational
  • 查找最新的错误事件

内部错误0x8007000B通常对应于以下值之一:

事件 ID 示例事件字符串 建议
150 错误0x8007000B:应用清单发布者名称(CN=Contoso)必须与签名证书的使用者名称(CN=Contoso,C=US)匹配。 应用清单发布者名称必须与签名的主题名称完全匹配。
151 错误0x8007000B:指定的签名哈希方法(SHA512)必须与应用包块映射(SHA256)中使用的哈希方法匹配。 /fd 参数中指定的 hashAlgorithm 不正确。 请使用与应用包块映射匹配的哈希算法重新运行SignTool(该映射用于创建应用包)
152 错误0x8007000B:应用包内容必须根据其块映射进行验证。 应用包已损坏,需要重新生成新的块映射。 有关创建应用包的详细信息,请参阅 使用 MakeAppx.exe 工具创建应用包

另一个常见错误是0x80080057。 尝试在 Windows 上使用 SignTool 工具对可移植可执行文件(PE)文件进行签名时,可能会遇到以下问题:

  • 无法对 4 GB 或更大的 PE 文件进行签名。 尝试签名时,会收到“无效参数(0x80080057)”错误消息。

  • 对于大于 4 GB 的文件,即使 SignTool 可能成功对文件进行签名,生成的哈希也可能不准确。

    注释

    这尤其适用于 .cat 文件。

PE 文件(如 .exe、.sys等)会出现此问题。 出现此问题的原因是 PE 标头中的 ULONG 变量指定了图像大小。 (映像大小为 2 GB,适用于下层作系统,如 Vista 和早期版本)。这是自 1996 年以来的设计限制。 对于 PE 文件,此值的最大限制为 4 GB,例如 .exe 和 .sys。 虽然 .cat 文件通常可签名,但生成的内部哈希可能不准确。

若要解决此问题,请确保尝试签名的任何 PE 文件小于 4 GB。 由于向后兼容性风险,目前无法进行后向移植和永久修复。 但是,正在调查此问题。

注释

此问题不特定于 SignTool。 无论使用哪种工具,PE 标头的设计都限制为 4 GB(适用于 Windows 7 及更高版本的 Windows 版本)。

常见问题 (FAQ)

问 1:Windows 上数字签名(和时间戳计数器签名)的当前官方文件大小限制是什么?

A1:对于 PE 文件(如 .exe 和 .sys),签名的最大文件大小为 4 GB。

问 2:是否有特定版本的 Windows(如 Windows Server 2016)能够对大型文件进行签名?

A2:否,此问题会影响所有版本的 Windows。

问 3:64 位版本的 Signtool 是否比 32 位版本更好的支持此功能?

答:否,64 位版本的 SignTool 使用与 32 位版本相同的值。 因此,此问题仍然存在于64位系统中。

问4:如果客户尝试使用使用 64 位版本的 SignTool 签名的文件,那么使用 32 位版本的 Windows 可能会遇到问题吗?

答:否。 但是,无论使用哪个版本的 SignTool,这些限制都将保持不变。

问 5:我们是否应该完全使用不同的签名工具或方法?

答:我们目前没有用于数字签名的替代方法。