如何排查应用包签名错误

应用包的数字签名验证失败,可能导致应用部署失败。 了解如何识别这些故障,以及如何处理这些故障。

部署打包的 Windows 应用时,Windows 始终尝试验证应用包上的数字签名。 在包的签名验证块部署过程中失败。 但为什么包没有得到验证可能并不明显。 特别是,如果使用私人证书对包进行签名以进行本地测试,则通常还必须管理这些证书的信任。 不正确的证书信任配置可能导致签名验证失败。

需要了解的事项

技术

先决条件

说明

第 1 步:检查事件日志以获取诊断信息

根据尝试部署应用程序的方式,可能没有收到部署失败的有意义的错误代码。 在这种情况下,通常可以直接从事件日志中获取错误代码。

从事件日志中获取错误代码

  1. 运行 eventvwr.msc

  2. 转到事件查看器(本地)>应用程序和服务日志>Microsoft>Windows

  3. 检查的第一个日志是 AppxPackagingOM>Microsoft-Windows-AppxPackaging/Operational

  4. 与部署相关的错误记录在 AppXDeployment-Server>Microsoft-Windows-AppXDeploymentServer/Operational 中。

    对于部署错误,请搜索最近的错误事件 404。 此错误事件提供错误代码和部署失败原因的描述。 如果错误事件 465 在 404 事件之前,则打开包时出现问题。

如果未发生 465 错误,请参阅通用 Windows 应用的故障排除、打包、部署和查询。 否则,请参阅此表,查看错误事件 465 的错误字符串中可能出现的常见错误码:

错误代码 错误 说明 建议
0x80073CF0 ERROR_INSTALL_OPEN_PACKAGE_FAILED 无法打开应用包。 此错误通常表示包出现问题。 需要再次生成包并对包进行签名。 有关详细信息,请参阅使用应用包生成工具
0x80080205 APPX_E_INVALID_BLOCKMAP 应用包被篡改或有一个无效的块映射。 包已损坏。 需要再次生成包并对包进行签名。 有关详细信息,请参阅使用应用包生成工具
0x800B0004 TRUST_E_SUBJECT_NOT_TRUSTED 应用包已被篡改。 包内容不再与其数字签名匹配。 需要再次对包进行签名。 有关详细信息,请参阅如何使用 SignTool 对应用包进行签名
0x800B0100 TRUST_E_NOSIGNATURE 未对应用包进行签名。 只能部署已签名的 Windows 应用包。 有关对应用包进行签名的信息,请参阅如何使用 SignTool 对应用包进行签名
0x800B0109 CERT_E_UNTRUSTED_ROOT 用于对应用包进行签名的证书链以不受信任的根证书结尾。 继续执行第 2 步,排查证书信任问题。
0x800B010A CERT_E_CHAINING 无法从用于对应用包进行签名的证书向受信任的根颁发机构构建证书链。 继续执行第 2 步,排查证书信任问题。

 

第 2 步:确定用于对应用包进行签名的证书链

若要找出本地计算机必须信任的证书,可以检查应用包上的数字签名的证书链。

确定证书链

  1. 在文件资源管理器中,右键单击应用包,然后选择属性
  2. 属性对话框中,选择数字签名选项卡,该选项卡还显示是否可以验证签名。
  3. 在“签名”列表中,选择签名,然后单击详细信息按钮。
  4. 数字签名详细信息对话框中,单击查看证书按钮。
  5. 证书对话框中,选择证书路径选项卡。

链中的顶部证书是根证书,底部证书是签名证书。 如果链中只有一个证书,则签名证书也是它自己的根证书。 可以确定每个证书的序列号,然后与 Certutil 一起使用:

确定每个证书的序列号

  1. 在“认证路径”窗格中,选择证书,然后单击查看证书
  2. 在“证书”对话框中,选择详细信息选项卡,其中显示证书的序列号和其他有用属性。

第 3 步:确定本地计算机信任的证书

为了能够部署应用包,它不仅必须在用户上下文中受信任,而且必须在本地计算机上下文中受信任。 因此,在上一步的“数字签名”选项卡中查看数字签名时,数字签名可能会显示为有效,但在应用包的部署过程中仍然无法通过验证。

确定用于对应用包进行签名的证书链是否受到本地计算机的特别信任

  1. 运行以下命令:

    CertUtil.exe -store Root rootCertSerialNumber
    
  2. 运行以下命令:

    CertUtil.exe -store TrustedPeople signingCertSerialNumber
    

如果未指定证书序列号,则 Certutil 会列出该存储的本地计算机信任的所有证书。

由于证书链接错误,包可能无法安装,即使签名证书不是自签名的,并且根证书位于本地计算机的根存储中。 在这种情况下,可能存在对中间证书颁发机构的信任问题。 有关此问题的更多信息,请参阅使用证书

注解

如果确定由于签名证书不受信任而无法部署该包,请不要安装该包,除非知道它的来源并且信任它。

如果要手动信任应用进行安装(例如,若要安装自己的测试签名应用包),可以从应用包手动将证书添加到本地计算机证书信任。

手动将证书添加到本地计算机证书信任

  1. 在文件资源管理器中,右键单击应用包,然后在弹出上下文菜单中选择属性
  2. 属性对话框中,选择数字签名选项卡。
  3. 在“签名”列表中,选择签名,然后单击详细信息按钮。
  4. 数字签名详细信息对话框中,单击查看证书按钮。
  5. 证书对话框中,单击安装证书… 按钮。
  6. 在证书导入向导中,选择本地计算机,然后单击下一步。 需要授予管理员权限才能继续。
  7. 选择将所有的证书放入下列存储,然后浏览到受信任人存储区。
  8. 单击下一步,然后单击完成完成向导。

手动添加后,可以在证书对话框中看到证书现在是受信任的。

可以在不再需要证书后将其删除。

移除证书

  1. 以管理员身份运行 Cmd.exe

  2. 在管理员命令提示符下,运行以下命令:

    Certutil -store TrustedPeople
    
  3. 查找安装的证书的序列号。 此数字是 certID

  4. 运行以下命令:

    Certutil -delStore TrustedPeople certID
    

建议避免将根证书手动添加到本地计算机受信任的根证书颁发机构证书存储区。 拥有多个使用链接到同一根证书的证书进行签名的应用程序(如业务线应用程序)可能比将单个证书安装到受信任人员存储更高效。 受信任人员存储包含默认情况下被视为受信任的证书,因此,颁发机构或证书信任列表或链不会进行验证。 有关将证书添加到受信任的根证书颁发机构证书存储区的注意事项,请参阅代码签名最佳做法

安全注意事项

通过将证书添加到本地计算机证书存储,你会影响计算机上的所有用户的证书信任。 建议将测试应用包所需的任何代码签名证书安装到受信任人员证书存储中。 当不再需要这些证书时,立即删除这些证书,以防止它们被用来危害系统信任。 如果创建自己的测试证书来对应用包进行签名,我们还建议限制与测试证书相关联的权限。 有关创建用于签名应用包的测试证书的详细信息,请参阅如何创建应用包签名证书

示例

创建应用包示例

概念

对 Windows 应用的打包、部署和查询进行故障排除

用于管理证书的 Certutil 任务