为 Windows 10 应用包签名

在创建可部署的 Windows 10 应用包过程中,应用包签名是必须执行的步骤。 Windows 10 要求使用有效的代码签名证书为所有应用程序签名。

若要成功安装 Windows 10 应用程序,该包不仅需要签名,而且还需在设备上受信任。 这意味着,该证书必须链接到设备上的某个受信任根。 默认情况下,Windows 10 信任提供代码签名证书的大部分证书颁发机构的证书。

此外,如果要创建 MSIX 捆绑包,则无需单独对捆绑包中的所有包进行签名。 只需对捆绑包进行签名,其内部所有的包都将以递归方式进行签名。

主题 说明
签名先决条件 此部分说明为 Windows 10 应用包签名所要满足的先决条件。
使用 SignTool 此部分介绍如何使用 Windows 10 SDK 中的 SignTool 为应用包签名。
使用 Device Guard 签名功能对 MSIX 包进行签名 本部分讨论如何使用 Device Guard 签名对应用进行签名。
创建用于测试的未签名包 本部分讨论如何创建未签名的 msix 包。

时间戳

强烈建议在使用证书对应用进行签名时使用时间戳。 时间戳可以保留签名,这样,即使是在证书过期之后,应用部署平台也会接受该应用包。 检查包时,可以使用时间戳根据包的签名时间验证包签名。 这样,即使证书不再有效,也会接受该包。 不带时间戳的包将会根据当前时间进行评估,如果证书不再有效,Windows 不会接受该包。

下面是围绕使用/不使用时间戳进行应用签名的各种方案:

方案 不使用时间戳为应用签名 使用时间戳为应用签名
证书有效 将会安装应用 将会安装应用
证书无效(已过期) 无法安装应用 将会安装应用,因为在签名时,证书的真实性已由时间戳机构验证

注意

如果应用已在设备上成功安装,则即使是在证书过期之后,该应用也会继续运行,而不管证书是否带有时间戳。

包完整性强制执行

除了确保设备上仅安装受信任的应用程序之外,对 MSIX 包进行签名的另一个好处是,在设备上部署包后,Windows 可以强制执行包及其内容的完整性。 通过链接到签名包中的 AppxBlockMap.xmlAppxSignature.p7x,Windows 能够在运行时和 Windows Defender 扫描期间对包及其内容的完整性执行验证检查。 如果认为某个包被篡改,Windows 将阻止应用程序启动并启动修正工作流,以修复或重新安装包。 对于未通过 Microsoft Store 分发的包,如果包声明 uap10:PackageIntegrity 元素,并且部署在 Windows 2004 及更高内部版本上,则会强制执行包完整性。 下面是 AppxManifest.xml 中包完整性强制执行声明的示例:

<Package ...
xmlns:uap10="http://schemas.microsoft.com/appx/manifest/uap/windows10/10"  
IgnorableNamespaces="uap10">
...
  <Properties>
    <uap10:PackageIntegrity>
      <uap10:Content Enforcement="on" />
    </uap10:PackageIntegrity>
  </Properties>
...
</Package>

设备模式

Windows 10 允许用户在“设置”应用中选择运行设备的模式。 模式包括“Microsoft Store 应用”、“旁加载应用”和“开发人员模式”。

“Microsoft Store 应用”是最安全的模式,因为它只允许从 Microsoft Store 安装应用。 Microsoft Store 中的应用会经历认证过程,确保应用可供安全使用。

“旁加载应用”和“开发人员模式”对其他证书签名的应用的宽容度更高,前提是这些证书受信任并已链接到设备上的某个受信任根。 仅当你是开发人员并在生成或调试 Windows 10 应用时,才能选择“开发人员模式”。 可在此处找到有关“开发人员模式”及其提供的功能的详细信息。

注意

从 Windows 10 版本 2004 开始,默认打开旁加载选项。 因此,开发人员模式现在可切换。 企业仍可以通过策略关闭旁加载。