使用 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) 。 提供了包含所需 DGSS v2 组件和迁移文档的NuGet包。 请阅读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 Microsoft Store

注意

如果 Windows Microsoft Store for Business 未显示在列表中,请打开新的浏览器选项卡,然后导航到https://businessstore.microsoft.com该选项卡,然后以租户全局管理员身份登录。 关闭浏览器选项卡,然后再次搜索。

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

获取 Azure AD 访问令牌

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

注意

如果 Windows Microsoft Store for Business 未显示在列表中,请打开新的浏览器选项卡,然后导航到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 签名的应用。 请务必阅读readme_cmdlets文档并从 DGSSv1 迁移到 NuGet 包中包含的 DGSSv2 文档。

常见错误

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

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