如何使用 SignTool 对应用包进行签名

注意

若要对Windows应用包进行签名,请参阅使用 SignTool 对应用包进行签名

了解如何使用 SignTool 对Windows应用包进行签名,以便部署它们。 SignTool 是Windows软件开发工具包 (SDK) 的一部分。

必须先对所有Windows应用包进行数字签名,然后才能部署它们。 虽然 Microsoft Visual Studio 2012 及更高版本可以在创建过程中对应用包进行签名,但使用应用打包程序 (MakeAppx.exe) 工具从 Windows SDK 创建的包未签名。

注意

只能使用 SignTool 在Windows 8及更高版本或Windows Server 2012及更高版本上对Windows应用包进行签名。 不能使用 SignTool 在下层操作系统(如 Windows 7 或 Windows Server 2008 R2)上对应用包进行签名。

需要了解的事项

技术

先决条件

其他注意事项

用于对应用包进行签名的证书必须满足以下条件:

  • 证书的使用者名称必须与存储在包中的AppxManifest.xml文件的 Identity 元素中包含的Publisher属性匹配。 发布者名称是打包Windows应用的标识的一部分,因此必须使证书的主题名称与应用的发布者名称匹配。 这允许根据数字签名检查已签名包的标识。 有关使用 SignTool 对应用包进行签名时可能出现的签名错误的信息,请参阅 “如何创建应用包签名证书的备注”部分。

  • 证书必须对代码签名有效。 这意味着这两项都必须为 true:

    • 证书的“扩展密钥用法 (EKU) ”字段必须未设置,或者必须包含代码签名的 EKU 值, (1.3.6.1.5.5.7.3.3) 。
    • 证书的密钥用法 (KU) 字段必须未设置或包含数字签名 (0x80) 的使用位。
  • 证书包含私钥。

  • 证书有效。 它处于活动状态,尚未过期,并且尚未吊销。

说明

步骤 1:确定要使用的哈希算法

对应用包进行签名时,必须使用创建应用包时所用的相同哈希算法。 如果使用默认设置创建应用包,则使用的哈希算法为 SHA256。

如果将应用打包程序与特定的哈希算法一起使用来创建应用包,请使用同一算法对包进行签名。 若要确定用于对包进行签名的哈希算法,可以提取包内容并检查AppxBlockMap.xml文件。 BlockMap 元素的 HashMethod 属性指示创建应用包时使用的哈希算法。 例如: 。

<BlockMap xmlns="http://schemas.microsoft.com/appx/2010/blockmap" 
HashMethod="https://www.w3.org/2001/04/xmlenc#sha256">

前面的 BlockMap 元素指示使用了 SHA256 算法。 下表列出了当前可用的算法的映射:

HashMethod hashAlgorithm 要使用的
https://www.w3.org/2001/04/xmlenc#sha256 SHA256 (.appx 默认)
https://www.w3.org/2001/04/xmldsig-more#sha384 SHA384
https://www.w3.org/2001/04/xmlenc#sha512 SHA512

步骤 2:运行SignTool.exe对包进行签名

使用 .pfx 文件中的签名证书对包进行签名

  • SignTool sign /fd hashAlgorithm /a /f signingCert.pfx /p password filepath.appx
    

如果未指定 ,SignTool 会将 /fd hashAlgorithm 参数默认为 SHA1,并且 SHA1 对应用包进行签名无效。 因此,在对应用包进行签名时,必须指定此参数。 若要对使用默认 SHA256 哈希创建的应用包进行签名,请将 /fd hashAlgorithm 参数指定为 SHA256:

SignTool sign /fd SHA256 /a /f signingCert.pfx /p password filepath.appx

如果使用不受密码保护的 .pfx 文件,则可以省略 /p 密码 参数。 还可以使用 SignTool 支持的其他证书选择选项对应用包进行签名。 有关这些选项的详细信息,请参阅 SignTool

注意

不能对已签名的应用包使用 SignTool 时间戳操作;不支持该操作。

如果要对应用包进行时间戳,则必须在签名操作期间执行此操作。 例如: 。

SignTool sign /fd hashAlgorithm /a /f signingCert.pfx /p password /tr timestampServerUrl 
filepath.appx

使 /tr timestampServerUrl 参数等于 RFC 3161 时间戳服务器的 URL。

备注

本部分讨论排查应用包的签名错误。

排查应用包签名错误

除了 SignTool 可以返回的签名错误外, SignTool 还可以返回特定于应用包签名的错误。 这些错误通常显示为内部错误:

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

如果错误代码以 0x8008(如 0x80080206 APPX_E_CORRUPT_CONTENT) )开头,则表示正在签名的包无效。 在这种情况下,必须先重新生成包,然后才能对包进行签名。 有关 0x8008* 错误的完整列表,请参阅 COM 错误代码 (安全和设置)

更常见的是,错误0x8007000b (ERROR_BAD_FORMAT) 。 在这种情况下,可以在事件日志中找到更具体的错误信息:

搜索事件日志

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

内部错误通常对应于下列错误之一:

事件 ID 事件字符串示例 建议
150 错误 0x8007000B:应用部件清单发布者名称 (CN=Contoso) 必须与签名证书的使用者名称 (CN=Contoso, C=US) 匹配。 应用清单发布者名称必须与签名证书的使用者名称完全匹配。
[!注意]
这些名称以引号指定,区分大小写和区分空格。

可以更新为AppxManifest.xml文件中的 Identity 元素定义的Publisher属性字符串,以匹配预期签名证书的主题名称。 或者,选择具有与应用清单发布者名称匹配的主题名称的其他签名证书。 清单发布者名称和证书使用者名称均列在事件消息中。
151 错误 0x8007000B:指定的签名哈希方法 (SHA512) 必须与应用包块映射中使用的哈希方法 (SHA256) 匹配。 /fd 参数中指定的 hashAlgorithm 不正确, (请参阅步骤 1:确定要使用的哈希算法) 。 使用与应用包块映射匹配的 hashAlgorithm 重新运行 SignTool
152 错误 0x8007000B:应用包内容必须针对其块映射进行验证。 应用包已损坏,需要重建以生成新的块映射。 有关创建应用包的详细信息,请参阅使用应用打包程序创建应用包,或使用 Visual Studio 2012 创建应用包

安全注意事项

对包进行签名后,用于对包进行签名的证书仍必须由要在其中部署包的计算机信任。 通过将证书添加到本地计算机证书存储,可以影响计算机上所有用户的证书信任。 建议将想要测试应用包的任何代码签名证书安装到受信任的人员证书存储,并在不再需要时立即删除这些证书。 如果为签名应用包创建自己的测试证书,建议限制与测试证书关联的特权。 有关如何创建用于签名应用包的测试证书的详细信息,请参阅 如何创建应用包签名证书

示例

创建应用包示例

概念

代码签名最佳做法

在 Visual Studio 2012 中签名包

SignTool

应用包生成工具 (MakeAppx.exe)

如何创建应用包签名证书