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

重要

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

重要

Device Guard 签名服务 v2 (DGSS v2) 现已可用。

5月 2021-将于2021年6月9日停用 Device Guard 签名服务 v1 的现有基于 web 的机制。 请转换为基于 PowerShell 的服务版本 (DGSS v2) 。 提供了包含必需的 DGSS v2 组件和迁移文档的NuGet 包。 请阅读 NuGet 包中包含的 Microsoft 使用条款;请注意,DGSS 的使用表示接受这些条款。 如有任何问题,请通过联系我们 DGSSMigration@microsoft.com 。

备注

下载 dgss/nupkg 后,你可以重命名为 .zip 并提取文件和其他文档和信息的内容

device guard 签名是一项 device guard 功能,在适用于企业的 Microsoft Store 和教育版中提供。 它使企业能够保证每个应用都来自受信任的来源。 你可以使用 Windows SDK 中的 SignTool 和 NuGet 包中的 DGSSv2 dlib,使用 Device Guard 签名对 .msix 应用进行签名。 此功能支持使你能够轻松地将设备防护登录纳入 .MSIX 包生成和签名工作流。

Device Guard 签名需要适用于企业的 Microsoft Store 中的权限,并使用 Azure Active Directory (AD) 身份验证。 若要使用 Device Guard 签名对 .MSIX 包进行签名,请按照下列步骤操作。

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

    备注

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

  2. 在适用于企业的 Microsoft Store (或适用于教育的 Microsoft Store) 中,为自己分配执行设备保护签名所需权限的角色。
  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 签名者角色。 当你作为已登录用户进行签名时,将使用全局管理员和计费帐户所有者。

确认或重新分配角色:

  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 directory-多租户) 和个人 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>

备注

  • 建议你在对包进行签名时使用一个时间戳选项。 如果不应用 时间戳,签名将在一年后过期,应用将需要重新签名。
  • 确保包清单中的发布者名称与用来对包进行签名的证书匹配。 利用此功能,它将是你的叶证书。 例如,如果 "叶证书" 是 " 公司 名称",则清单中的发布者名称必须是 CN = "公司 名称"。 否则,签名操作将失败。
  • 仅支持 SHA256 算法。
  • 使用 Device Guard 签名时,不会通过 Internet 发送包。

测试

若要测试,请通过单击此处下载根证书,或下载NuGet,然后使用 命令获取该证书:

Get-RootCertificate

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

重要

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

常见错误

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

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