使用 Device Guard 签名功能对 MSIX 包进行签名

重要

适用于企业的 Microsoft Store 和 适用于教育的 Microsoft Store 将于 2023 年第一季度停用。 在此之前,你可以继续使用免费应用的当前功能。 有关此更改的详细信息,请参阅不断发展适用于企业和教育的 Microsoft Store

重要

Device Guard 签名服务 v2 (DGSS v2) 现已推出。

2021 年 5 月 - Device Guard 签名服务 v1 现有的基于 Web 的机制将于 2021 年 6 月 9 日停用。 请过渡到基于 PowerShell 的服务版本 (DGSS v2)。 我们提供一个 NuGet 包,其中包含所需的 DGSS v2 组件和迁移文档。 请阅读 NuGet 包中包含的 Microsoft 使用条款;请注意,使用 DGSS 即表示接受这些条款。 如有疑问,请发送电子邮件到 DGSSMigration@microsoft.com 联系我们。

注意

下载 microsoft.acs/dgss.client.nupkg 后,可将其重命名为 .zip 并提取文件和附加文档和信息的内容

Device Guard 签名是适用于企业和教育的 Microsoft Store 中可用的 Device Guard 功能。 它使企业能够保证每个应用都来自受信任的源。 可以使用 Windows SDK 中的 SignTool 和 NuGet 包中的 DGSSv2 dlib 通过 Device Guard 签名对 MSIX 应用进行签名。 此功能支持使你可以轻松地将 Device Guard 签名合并到 MSIX 包生成和签名工作流中。

Device Guard 签名需要适用于企业的 Microsoft Store 中的权限,并使用 Azure Active Directory (AD) 身份验证。 要使用 Device Guard 签名功能对 MSIX 包进行签名,请执行以下步骤。

  1. 如果尚未注册,注册适用于企业的 Microsoft Store 或适用于教育的 Microsoft Store

    注意

    只需使用此门户来配置 Device Guard 签名的权限。

  2. 在适用于企业的 Microsoft Store(或适用于教育的 Microsoft Store)中,为自己分配具有执行 Device Guard 签名所需的权限的角色。
  3. Azure 门户中注册应用并正确设置,以便可以将 Azure AD 身份验证用于适用于企业的 Microsoft Store。
  4. 获取 JSON 格式的 Azure AD 访问令牌。
  5. 运行 SignTool,使用 Device Guard 签名对 MSIX 包进行签名,并传递在上一步中获取的 Azure AD 访问令牌。

以下各部分更详细地说明了这些步骤。

配置 Device Guard 签名的权限

要在适用于企业的 Microsoft Store 或适用于教育的 Microsoft Store 中使用 Device Guard 签名,需要 Device Guard 签名者角色。 这是具有签名能力的最低特权角色。 其他角色(如全局管理员计费帐户所有者)也可以签名。

注意

应用进行签名时,将使用 Device Guard 签名者角色。 以登录人员身份登录时,将使用全局管理员和计费帐户所有者。

要确认或重新分配角色,请执行以下操作:

  1. 登录适用于企业的 Microsoft Store
  2. 选择“管理”,然后选择“权限”
  3. 查看“角色”

有关更多详细,请参阅适用于企业和教育的 Microsoft Store 中的角色和权限

在 Azure 门户中注册你的应用

要使用正确的设置注册应用,以便可以将 Azure AD 身份验证用于适用于企业的 Microsoft Store,请执行以下操作:

  1. 导航到 https://portal.azure.com,以租户全局管理员身份进行身份验证

  2. 导航到 Azure Active Directory Azure 服务。

  3. 从左侧菜单的“管理”下,选择“应用注册”

  4. 从菜单栏中,选择“新建注册”

  5. 在“名称”字段中,输入 DGSSv2

    注意

    “名称”字段用于在 Azure 门户中轻松识别应用注册。 可以使用所需的任何名称。 出于演示目的,我们使用 DGSSv2 只是为了便于识别。

  6. 在“支持的帐户类型”下,选择适当的设置。

    • 仅此组织目录中的帐户(单租户)- 除非你对多租户部署有特定需求,否则建议使用此选项。 目录中的所有用户和来宾帐户都可以使用应用程序或 API。
    • 任何组织目录(任何 Azure AD 目录 - 多租户)中的帐户- 此选项最适合具有多个 Azure AD 租户,但只需要一个代码签名信任点的组织。 拥有 Microsoft 工作或学校帐户的所有用户都可以使用应用程序或 API。 这包括使用 Office 365 的学校和企业。
    • 任何组织目录(任何 Azure AD 目录 - 多租户)中的帐户和个人 Microsoft 帐户(例如 Skype、Xbox)- 不建议使用此选项,因为它对使用者级别 Microsoft 帐户开放使用。 拥有工作或学校帐户或者个人 Microsoft 帐户的所有用户都可以使用应用程序或 API。 这包括使用 Office 365 的学校和企业以及用来登录 Xbox 和 Skype 等服务的个人帐户。
    • 仅限个人 Microsoft 帐户 - 与上一个选项一样,也不建议使用此选项。 这不仅是因为它允许个人帐户,而且因为此选项仅支持个人帐户。 明确阻止 Azure AD 帐户。 用于登录 Xbox 和 Skype 等服务的个人帐户
  7. 在“重定向 URI”下拉列表中,从下拉选择菜单中选择“公共客户端/本机(移动和桌面)”。 在文本框中输入 https://dgss.microsoft.com

  8. 单击“注册”

  9. 在页面右上角找到标记为“重定向 URI”的条目。 选择其下方标记为“0 个 Web、0 个 SPA、1 个公共客户端”的行

  10. 在“高级设置”部分找到标记为“允许公共客户端流”的条目。 将该值设置为“是”

  11. 单击页顶部的“保存”

  12. 从左侧菜单中,选择“API 权限”

  13. 从菜单栏中选择“添加权限”。在浮出控件菜单中,选择“我的组织使用的 API”选项卡。在搜索框中输入“适用于企业的 Windows 应用商店”

注意

如果适用于企业的 Windows 应用商店未显示在列表中,请打开新的浏览器选项卡并导航到 https://businessstore.microsoft.com,然后以租户全局管理员身份登录。 关闭浏览器选项卡,然后再次搜索。

  1. 选择“适用于企业的 Windows 应用商店”,然后选择“委托的权限”。检查 user_impersonation
  2. 单击页面底部的“添加权限”。 从左侧菜单中选择“概述”以返回到 DGSSv2 应用注册概述。

获取 Azure AD 访问令牌

接下来,获取 JSON 格式的 Azure AD 应用的 Azure AD 访问令牌。 可以使用各种编程和脚本语言执行此操作。 有关此过程的详细信息,请参阅使用 OAuth 2.0 代码授权流来授权访问 Azure Active Directory Web 应用程序。 建议检索刷新令牌以及访问令牌,因为访问令牌将在一小时内过期。

注意

如果适用于企业的 Windows 应用商店未显示在列表中,请打开新的浏览器选项卡并导航到 https://businessstore.microsoft.com,然后以租户全局管理员身份登录。 关闭浏览器选项卡,然后再次搜索。

以下 PowerShell 示例演示如何请求访问令牌。

function GetToken()
{

    $c = Get-Credential -Credential $user
    
    $Credentials = New-Object System.Management.Automation.PSCredential -ArgumentList $c.UserName, $c.password
    $user = $Credentials.UserName
    $password = $Credentials.GetNetworkCredential().Password
    
    $tokenCache = "outfile.json"

    #replace <application-id> and <client_secret-id> with the Application ID from your Azure AD application registration
    $Body = @{
      'grant_type' = 'password'
      'client_id'= '<application-id>'
      'client_secret' = '<client_secret>'
      'resource' = 'https://onestore.microsoft.com'
      'username' = $user
      'password' = $password
    }

    $webpage = Invoke-WebRequest 'https://login.microsoftonline.com/common/oauth2/token' -Method 'POST'  -Body $Body -UseBasicParsing
    $webpage.Content | Out-File $tokenCache -Encoding ascii
}

注意

建议保存 JSON 文件供以后使用。

获取 Device Guard 签名版本 2 DLL

要使用 Device Guard 签名版本 2 进行签名,请通过下载将用于对包进行签名的 NuGet 包来获取 Microsoft.Acs.Dlib.dll。 获取根证书也需要如此操作。

对包进行签名

获得 Azure AD 访问令牌后,即可使用 SignTool 通过 Device Guard 签名对包进行签名。 有关使用 SignTool 对包进行签名的详细信息,请参阅使用 SignTool 对应用包进行签名

以下命令行示例演示如何使用 Device Guard 签名版本 2 对包进行签名。

signtool sign /fd sha256 /dlib Microsoft.Acs.Dlib.dll /dmdf <Azure AAD in .json format> /t <timestamp-service-url> <your .msix package>

注意

  • 为 Device Guard 签名 v2 生成的证书有效期为一天。 建议在对包进行签名时使用时间戳选项之一。 如果不应用时间戳,签名将在一天内过期,需要重新签名应用。
  • 请确保包清单中的发布者名称与用于对包进行签名的证书匹配。 使用此功能时,该项将为叶证书。 例如,如果叶证书是 CompanyName,则清单中的发布者名称必须是 CN=CompanyName。 否则,签名操作将失败。
  • 仅支持 SHA256 算法。
  • 使用 Device Guard 签名对包进行签名时,不会通过 Internet 发送包。

测试

要进行测试,请单击此处下载根证书,或下载 NuGet 包并使用以下命令获取根证书:

Get-RootCertificate

将根证书安装到设备上“受信任的根证书颁发机构”。 安装新签名的应用,验证是否已使用 Device Guard 签名成功对应用进行签名。

重要

为了实现隔离,请部署 WDAC CI 策略以信任使用 DGSSv2 进行签名的应用。 请务必阅读 NuGet 包中包含的 readme_cmdlets 文档以及从 DGSSv1 迁移到 DGSSv2 的文档。

常见错误

下面是可能会遇到的常见错误。

  • 0x800700d:此常见错误表示 Azure AD JSON 文件的格式无效。
  • 下载 Device Guard 签名的根证书之前,可能需要接受适用于企业的 Microsoft Store 的条款和条件。 可以通过在门户中获取免费应用来完成此操作。