为 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.xml 和 AppxSignature.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 开始,默认打开旁加载选项。 因此,开发人员模式现在可切换。 企业仍可以通过策略关闭旁加载。