如何在 Microsoft Intune 中逐步设置云 PKI


Microsoft Cloud PKI 是一种现代的证书管理方法,直接从 Microsoft Intune 管理门户(或使用 Graph API 以编程方式)完成,无需任何复杂的本地基础设施。它允许您从云创建根证书颁发机构和颁发证书颁发机构,这些证书颁发机构是您私有的。然后,设备配置文件可以自动将证书部署到最终用户设备,用于 WiFi、VPN、代码签名等身份验证方案。

在这篇博文中,我将向您展示如何使用 Web 门户和 Microsoft Graph PowerShell 在 Microsoft Intune 中部署 Microsoft Cloud PKI 基础结构,以向终端设备颁发证书。

先决条件

在开始之前,请确保满足使用 Microsoft Intune 在环境中部署 Cloud PKI 的所有先决条件。

许可

Cloud PKI 作为 Intune Suite 许可包的一部分。因此,您必须确保任何将从 Microsoft Cloud PKI 中受益的用户都分配有 Intune Suite 许可证。

权限

要访问使用 Microsoft Intune 部署 PKI 基础结构所需的所有功能,如果您不使用自定义角色,则您至少必须具有 Intune 管理员角色。

如果您使用 Microsoft Graph PowerShell,则您的应用程序必须获得以下权限:DeviceManagementConfiguration.ReadWrite.All,这将使您能够创建配置配置文件。至于创建 CA 的权限,Graph API 目前存在缺陷,允许您在不分配任何权限的情况下创建 CA。

云 PKI 的优势

  • 一般而言,大大消除了 PKI 部署的复杂性。
  • 无需复杂的 NDES 部署。
  • 从资本支出转向运营支出模式。
  • 到云的自然升级路径。
  • 支持 Intune SCEP 证书配置文件,其中包括 Windows、IOS、iPadOS、Android 和 MacOS,但不包括 Linux。
  • 可以通过 Intune Suite 获取附加功能或单独的 PKI 附加许可证。
  • 可以导出根和中间 CA 证书以供第三方服务使用。
  • CA 密钥由 HSM 支持。
  • Cloud PKI 与 Intune 租户位于同一地理区域,并具有内置冗余。
  • 已颁发的证书将通过 SCEP 证书配置文件自动替换(而不是直接续订)。
  • 颁发的证书可以通过门户手动撤销。

成本分析,值得吗?

采用 Intune Suite 的核心困难之一是价格。年度承诺价格为 8.20 英镑,每月滚动合同价格为 9.84 英镑,第 3 方解决方案虽然不提供相同的易用性和功能,但往往仅凭价格取胜。

暂时排除本地解决方案(由于明显的规模经济以及假定的硬件和劳动力成本),最好的竞争对手是 SCEPman,提供每个用户每月 1 欧元的固定产品价格为最多 200 个用户提供云 CA 服务。此后出现了明显的规模经济,3625 个用户每月的总成本减少了 1000 欧元。

与以相同速率无限扩展的Cloud PKI相比,价格无可比拟。目前,该产品与 Intune Suite 许可证捆绑在一起,它还有许多其他好处,如果采用所有功能,它就会变得很有吸引力。假设独立Cloud PKI(尚未发布)的价格为每用户每月2 美元。即,200 名用户每月 400 美元,3625 名用户每月 7250 美元(约 6680 欧元)。

评估 Cloud PKI 财务价值的唯一准确方法是针对现有产品和 Intune 套件执行总拥有成本计算。然而,对于完全投资于微软产品套件的新客户来说,这已经是一个艰难的推销。 https://transform.microsoft.com/ 等工具可以帮助您完成这一旅程。

创建新的根 CA

1. 登录 https://intune.microsoft.com。

2. 导航至租户管理页面,然后单击云PKI>创建

3. 定义您的根 CA 的名称。我将选择 OurCloudNetworkRootCA,然后单击下一步

4. 将CA类型配置为根CA,然后根据需要定义有效期。我建议选择10年。然而,不同的提供商建议的有效期不同。

此外,在扩展密钥用法下,定义您在颁发 CA 中可能需要的所有用法,因为您无法返回修改这些属性。

5. 对于主题属性,最好准确填写。

6. 最后,在加密设置下选择最高的加密选项以获得最佳保护。虽然是传统部署,但设置更高的算法可能会对安全性和功能产生重大影响,但对于 Cloud PKI 来说,这并不是一个令人担忧的问题。在最后几页中点击下一步,然后点击创建

使用 PowerShell 创建新的根 CA

您可以使用 Microsoft Graph PowerShell 部署 Cloud PKI 根 CA。下面的代码将使用我上面定义的设置部署根 CA。在使用PowerShell进行部署之前,您必须修改相关名称、算法和扩展密钥用法以满足您的需求。

Connect-MgGraph -scope DeviceManagementConfiguration.ReadWrite.All

$body = @{
  commonName = "Our Cloud Network RootCA"
  displayName = "OurCloudNetworkRootCA"
  cloudCertificationAuthorityType = "rootCertificationAuthority"
  certificationAuthorityIssuerId = $null
  validityPeriodInYears = 10
  certificateKeySize = "rsa4096"
  cloudCertificationAuthorityHashingAlgorithm = "sha512"
  organizationName = "Our Cloud Network"
  organizationUnit = "IT"
  countryName = "UK"
  stateName = "Kent"
  localityName = "GB"
  roleScopeTagIds = @(
    "0"
  )
  extendedKeyUsages = @(
    @{
      name = "Server auth"
      objectIdentifier = "1.3.6.1.5.5.7.3.1"
    }
    @{
      name = "Client auth"
      objectIdentifier = "1.3.6.1.5.5.7.3.2"
    }
    @{
      name = "Code signing"
      objectIdentifier = "1.3.6.1.5.5.7.3.3"
    }
  )
}

Invoke-MgGraphRequest -Method POST `
-Uri "/beta/deviceManagement/cloudCertificationAuthority" `
-Body $body `
-ContentType "application/json"

以下是 Cloud PKI 中支持的扩展密钥用法的对象标识符列表。

  1. 服务器身份验证(1.3.6.1.5.5.7.3.1)
  2. 客户端身份验证 (1.3.6.1.5.5.7.3.2)
  3. 代码签名 (1.3.6.1.5.5.7.3.3)
  4. 电子邮件保护 (1.3.6.1.5.5.7.3.4)
  5. IPSEC 端系统 (1.3.6.1.5.5.7.3.5)
  6. IPSEC 隧道 (1.3.6.1.5.5.7.3.6)
  7. IPSEC 用户 (1.3.6.1.5.5.7.3.7)
  8. 时间戳 (1.3.6.1.5.5.7.3.8)
  9. OCSP 签名 (1.3.6.1.5.5.7.3.9)
  10. 智能卡登录 (1.3.6.1.4.1.311.20.2.2)
  11. Mac地址(1.3.6.1.1.1.1.22)

创建新的颁发 CA

现在您已经部署了根 CA,您可以创建新的颁发 CA。请按照以下步骤创建您的颁发 CA。

1. 导航到租户管理页面,然后单击Cloud PKI>创建,重新启动新的 CA 向导。

2. 定义颁发CA的名称,我选择了OurCloudNetworkIssuingCA ,然后单击下一步

3. 对于CA 类型,选择颁发CA。然后,您需要选择根 CA。首先选择 Intune 作为根 CA 源,然后从列表中选择您的根 CA。还要选择有效期,作为良好的做法,我选择了2年

4. 在扩展密钥用法下选择您想要颁发的证书类型。我已将其与我的根 CA 相匹配。

5. 与您对根 CA 的操作类似,完成所有主题属性,并确保修改通用名称

6. 最后,您可以看到颁发 CA 的加密设置已从根 CA 继承。在最后几页中单击下一步,然后单击创建。

使用 PowerShell 创建新的颁发 CA

与我们的根 CA 一样,您可以使用 Microsoft Graph PowerShell 使用以下代码创建您的颁发 CA。再次确保您修改设置以满足您的要求。

$body = @{
  commonName = "Our Cloud Network Issuing CA"
  displayName = "OurCloudNetworkIssuingCA"
  cloudCertificationAuthorityType = "issuingCertificationAuthority"
  certificationAuthorityIssuerId = "e95d737f-ab0d-401f-9b4b-aaf76bed80e5"
  validityPeriodInYears = 2
  certificateKeySize = "rsa4096"
  cloudCertificationAuthorityHashingAlgorithm = "sha512"
  organizationName = "Our Cloud Network"
  organizationUnit = "IT"
  countryName = "UK"
  stateName = "Kent"
  localityName = "GB"
  roleScopeTagIds = @(
    "0"
  )
  extendedKeyUsages = @(
    @{
      name = "Server auth"
      objectIdentifier = "1.3.6.1.5.5.7.3.1"
    }
    @{
      name = "Client auth"
      objectIdentifier = "1.3.6.1.5.5.7.3.2"
    }
    @{
      name = "Code signing"
      objectIdentifier = "1.3.6.1.5.5.7.3.3"
    }
  )
}

Invoke-MgGraphRequest -Method POST `
-Uri "/beta/deviceManagement/cloudCertificationAuthority" `
-Body $body `
-ContentType "application/json"

下载并部署 CA 证书

在开始向设备颁发证书之前,我们必须下载根证书和颁发 CA 证书,然后创建设备配置文件以将其部署到我们的设备。按照以下标题完成配置。

第一步是下载 CA 证书,该证书必须上传到客户端设备的受信任根证书和中间证书存储。为此,请在 Intune 管理门户中导航到您的 CA,然后在属性选项卡上单击下载按钮,并确保将证书保存在安全的位置。

现在,请按照以下步骤创建配置文件以部署证书:

1. 在 Intune 管理中心中,导航到设备 > 配置 > 创建>新策略

2. 选择Windows 10 及更高版本 > 模板,然后从列表中选择受信任的证书模板并单击创建

3. 定义策略的名称,然后单击下一步。 (我选择了“部署颁发 CA”)

4. 选择您下载的中级证书,并将目标存储设置为计算机证书存储 - 中级,然后点击下一步 >。

5. 在分配选项卡上,选择部署目标组。我建议创建一个试点小组进行测试。我创建了一个名为云 PKI 设备的新组,其中包括一些托管设备。

6. 完成向导的最后几页,然后单击创建

7. 再次为根 CA 证书完成这些步骤,但这次对于目标存储,选择计算机证书存储 - 根

使用 PowerShell 下载并部署 CA 证书

整个步骤可以使用以下 PowerShell 函数自动化。只需在执行该功能时修改 CA 的名称、组 ID 和策略名称,它就会自动抓取编码的 Base64 证书,创建新的设备配置文件并将其分配给您的组。

Function DeployCloudPKICA (){

    <#
    .Author
        Name:      Daniel Bradley
        LinkedIn:  https://www.linkedin.com/in/danielbradley2/
        Blog:      https://ourcloudnetwork.com

    .Example
        DeployCloudPKICA -CA "OurCloudNetworkIssuingCA" -Groupid "5d91d8ee-a40c-45f0-be1d-d5684e636ce6" -PolicyName "Deploy Issuing CA"
    #>
    
    param(
     $CA,
     $Groupid,
     $PolicyName
    )

    #Obtain CA information
    $uri = "https://graph.microsoft.com/beta/deviceManagement/cloudCertificationAuthority?`$filter=displayname eq '$CA'"
    $CAInfo = Invoke-MgGraphRequest -Method GET -Uri $uri

    #Extract Base64 cert
    [regex]$regex = '(?<=data:application/x-x509-ca-cert;base64,).*$'
    $Cert = $regex.Matches($CAInfo.value.certificateDownloadUrl) | foreach-object {$_.Value}

    #Create policy
    Write-Output "creating policy for $($CAInfo.value.commonname)"
    $body = @{
      id = "00000000-0000-0000-0000-000000000000"
      displayName = "$PolicyName"
      roleScopeTagIds = @(
        "0"
      )
      "@odata.type" = "#microsoft.graph.windows81TrustedRootCertificate"
      destinationStore = "computerCertStoreIntermediate"
      certFileName = "$($CAInfo.value.commonname).cer"
      trustedRootCertificate = $Cert
    }
    $RootCAProfile = Invoke-MgGraphRequest -Method POST `
    -Uri "/beta/deviceManagement/deviceConfigurations" `
    -Body $body `
    -ContentType "application/json"

    #Assign policy to group ID
    Write-Output "Assigning $($CAInfo.value.commonname) to $($groupid)"
    $AssignBody = @{
      assignments = @(
        @{
          target = @{
            "@odata.type" = "#microsoft.graph.groupAssignmentTarget"
            groupId = "$groupid"
          }
        }
      )
    }
    Invoke-MgGraphRequest -Method POST `
    -Uri "/beta/deviceManagement/deviceConfigurations/$($RootCAProfile.id)/assign" `
    -Body $AssignBody `
    -ContentType "application/json"
}

DeployCloudPKICA -CA "OurCloudNetworkRootCA" -Groupid "5d91d8ee-a40c-45f0-be1d-d5684e636ce6" -PolicyName "Deploy Root CA"
DeployCloudPKICA -CA "OurCloudNetworkIssuingCA" -Groupid "5d91d8ee-a40c-45f0-be1d-d5684e636ce6" -PolicyName "Deploy Issuing CA"

向设备颁发证书

现在您已准备好向我们的最终用户颁发证书。这是使用 SCEP 证书模板通过设备配置配置文件完成的。请按照以下步骤在 Intune 中将证书部署到最终用户。

1. 在 Intune 管理中心中,导航到设备 > 配置 > 创建>新策略

2. 选择 Windows 10 及更高版本 > 模板,然后从列表中选择 SCEP 证书模板并点击创建

3. 定义策略的名称,然后单击下一步。我选择了“SCEP 证书 - 客户端身份验证”。

4. 在配置设置页面上,我将使用以下设置:

  • 证书类型:用户
  • 主题名称格式:保留默认值
  • 主题备用名称:保留默认值
  • 证书有效期:1年(默认)
  • 密钥存储提供商:软件KSP(如果将密钥大小设置为4096,则只能选择此选项)
  • 密钥用法:数字签名和密钥加密
  • 密钥大小(位): 4096
  • 哈希算法: SHA-2

5. 单击 + 根证书e 并从列表中选择您的颁发 CA注意:此列表将向您显示通过配置配置文件部署的 CA 列表,而不是来自租户管理下的 Cloud PKI 列表。

6. 从扩展密钥用法下的预定义值下拉框中选择客户端身份验证

7. 在注册设置下,将续订阈值保留为默认值 (20%),然后从您的颁发 CA 复制并粘贴 SCEP 服务器 URL,然后单击下一步

租户管理获取 SCEP URL > Cloud PKI > 选择颁发 CA > 属性 > SCEP URI。

8. 在分配选项卡上,将此策略分配给您的目标设备组(可能与之前的组相同),然后继续完成策略的创建。

使用 PowerShell 自动部署 SCEP 配置文件

虽然有点棘手,但 SCEP 配置文件可以使用 Microsoft Graph PowerShell 自动部署。确保您在下面的脚本开头定义了变量,然后让它为您完成其余的工作!

#Define these variables
$CA = "OurCloudNetworkIssuingCA"
$Groupid = "5d91d8ee-a40c-45f0-be1d-d5684e636ce6"
$TrustedCertificateRootProfileName = "Deploy Root CA"

#Get CA Info and Trust Root Certificate deployment profile info
$CAuri = "https://graph.microsoft.com/beta/deviceManagement/cloudCertificationAuthority?`$filter=displayname eq '$CA'"
$CAInfo = Invoke-MgGraphRequest -Method GET -Uri $CAuri
$ProfileUri = "https://graph.microsoft.com/beta/deviceManagement/deviceConfigurations?`$filter=displayName eq '$TrustedCertificateRootProfileName'"
$ProfileInfo = Invoke-MgGraphRequest -Method GET -Uri $ProfileUri

$body = @{
  id = "00000000-0000-0000-0000-000000000000"
  displayName = "Deploy SCEP Certificate"
  roleScopeTagIds = @(
    "0"
  )
  "@odata.type" = "#microsoft.graph.windows81SCEPCertificateProfile"
  renewalThresholdPercentage = 20
  certificateStore = "user"
  certificateValidityPeriodScale = "years"
  certificateValidityPeriodValue = 1
  subjectNameFormat = "custom"
  subjectNameFormatString = "CN={{UserName}},E={{EmailAddress}}"
  keyStorageProvider = "useSoftwareKsp"
  keyUsage = "digitalSignature,keyEncipherment"
  keySize = "size4096"
  hashAlgorithm = "sha2"
  extendedKeyUsages = @(
    @{
      name = "Client Authentication"
      objectIdentifier = "1.3.6.1.5.5.7.3.2"
    }
  )
  scepServerUrls = @(
    "$($CAInfo.Value.ScepServerUrl)"
  )
  "[email " = "https://graph.microsoft.com/beta/deviceManagement/deviceConfigurations('$($ProfileInfo.value.id)')"
}

#Create Profile
$SCEPProfile = Invoke-MgGraphRequest -Method POST `
-Uri "/beta/deviceManagement/deviceConfigurations/" `
-Body $Body `
-ContentType "application/json"

#Assign Profile
$AssignBody = @{
    assignments = @(
        @{
            target = @{
            "@odata.type" = "#microsoft.graph.groupAssignmentTarget"
            groupId = "$groupid"
            }
        }
    )
}
Invoke-MgGraphRequest -Method POST `
-Uri "/beta/deviceManagement/deviceConfigurations/$($SCEPProfile.id)/assign" `
-Body $AssignBody `
-ContentType "application/json"

验证部署是否成功

虽然本文的目的不是在任何特定场景中部署证书,但我们仍然可以确保我们推送的证书成功部署到最终用户设备,并确保证书状态正常。

登录客户端系统并从 Windows 搜索中打开管理用户证书控制面板工具。

展开中级证书颁发机构,然后展开证书。您应该会看到列出的颁发证书。

然后展开受信任的根证书颁发机构,然后展开证书,您还应该看到列出的根证书。

最后,单击个人文件夹并选择证书。在这里,您应该看到从 Cloud PKI 颁发的证书。双击它并查看认证路径选项卡。您应该在此处看到列出的完整路径和证书状态为正常

常见问题解答

Cloud PKI 何时全面可用?

Cloud PKI 将于3 月 1 日全面开放。

您可以用云 PKI 完全取代本地 PKI 吗?

您可以显着简化和减少与私有(本地)PKI 相关的工作负载,但尚未完全取代它。

你们可以实现Cloud PKI跨租户吗?

当您在 Cloud PKI 中创建根 CA 时,这是您的租户私有的。您无法从另一个租户中的根 CA 签署颁发 CA 证书,但可以从本地 CA 签署该证书。

我可以用它来替换现有的本地 RADIUS 进行 WiFi 身份验证吗?

不。Cloud PKI 不是 RADIUS 服务。没有已知信息表明 Microsoft 正在实施基于云的 RADIUS 服务。