私钥保护

简介

FAS 证书存储在 FAS 服务器上的嵌入式数据库中。 与 FAS 证书关联的私钥存储在 FAS 服务器的“网络服务”帐户下。 默认情况下,密钥是不可导出的 2048 位 RSA,在 Microsoft Software Key Storage Provider 中创建并存储。

使用 FAS PowerShell 命令 PowerShell cmdlet 可以更改私钥的属性和存储位置。

注意:

FAS 配置和证书本地存储在 FAS 服务器中。 数据不在 FAS 服务器之间共享。

在 Citrix Virtual Apps and Desktops 2411 之前的 FAS 版本中,请通过编辑 %programfiles%\Citrix\Federated Authentication Service\Citrix.Authentication.FederatedAuthenticationService.exe.config 中的 XML 文件来配置私钥属性。 它已被 PowerShell 命令取代,后者提供了更大的灵活性,并且无需重新启动 FAS 服务器即可应用。 此外,与 XML 文件设置不同,使用 PowerShell 进行的配置在升级 FAS 服务器时会保留。 因此,不再支持使用 XML 文件进行以下设置的配置:

  • Citrix.TrustFabric.ClientSDK.TrustAreaJoinParameters.KeyProtection
  • Citrix.TrustFabric.ClientSDK.TrustAreaJoinParameters.ProviderLegacyCsp
  • Citrix.TrustFabric.ClientSDK.TrustAreaJoinParameters.ProviderName
  • Citrix.TrustFabric.ClientSDK.TrustAreaJoinParameters.ProviderType
  • Citrix.TrustFabric.ClientSDK.TrustAreaJoinParameters.KeyLength

请参阅从 Citrix Virtual Apps and Desktops 2411 之前的 FAS 版本进行升级

有关 FAS 证书和模板的信息

FAS 持有两种类型的证书:授权证书(通常有一个实例)和用户证书。

注意:

FAS 授权证书有时也称为注册机构请求代理 (RA) 证书。

FAS 在请求证书时使用证书模板,如下一部分内容所述。 虽然 FAS 确实在证书请求中指定了模板的名称,但它不会读取模板的内容。 因此,更改模板的设置不会影响 FAS 提出的证书请求。 更改模板的某些属性会影响 CA 生成的证书。 例如,您可以使用模板更改有效期。

FAS 授权证书

此证书是在您配置 FAS 时创建的。 可以使用 FAS 管理控制台的授权重新授权按钮来请求新授权证书。

还可以使用 PowerShell 命令,它提供了更大的灵活性:

  • New-FasAuthorizationCertificate:此命令的行为与 FAS 管理控制台类似,但可以指定在授权过程中使用的证书模板。
  • New-FasAuthorizationCertificateRequest:此命令创建授权证书的脱机请求;脱机授权

授权证书有时也称为 RA 证书,因为 FAS 充当注册机构,代表用户请求证书。 该证书具有增强的密钥用法证书请求代理,允许其在请求 FAS 用户证书时用作授权凭据。

默认情况下,授权过程使用以下模板:

  • Citrix_RegistrationAuthority_ManualAuthorization:使用此模板创建的证书属于临时证书,有效期较短,用于引导授权过程;
  • Citrix_RegistrationAuthority:使用此模板创建的证书有效期较长,由 FAS 服务器进行存储。

授权 FAS 需要执行以下步骤:

  1. FAS 创建一个密钥对,并向 CA 发送证书签名请求 (CSR),指定密钥对的公钥和模板 Citrix_RegistrationAuthority_ManualAuthorization

  2. 模板的颁发要求指定 CSR 必须由 CA 管理员手动批准。

  3. CA 管理员批准了 CSR 后,CA 就会创建一个可供 FAS 检索的证书。 此证书有效期较短,只有一天,仅用于下一个步骤。 使用后,FAS 就会销毁该证书及其密钥对。

  4. FAS 创建另一个密钥对,并向 CA 发送第二个 CSR,指定此密钥对的公钥和模板 Citrix_RegistrationAuthority。 该请求已获得上一步中的证书授权并签名。

  5. CA 自动颁发证书,FAS 检索证书,FAS 现在已获得授权。 默认情况下,此授权证书的有效期为两年。

可以使用以下 PowerShell 命令查看之前提到的用于创建密钥对的设置:

Get-FasKeyConfig -Address localhost -CertificateType ra

FAS 用户证书

FAS 创建用户证书以便用户登录 VDA。

FAS 创建用户证书时,将执行以下步骤:

  • FAS 创建一个密钥对并向 CA 发送一个 CSR,指定密钥对的公钥、用户的身份以及默认的模板 Citrix_SmartcardLogon(使用的模板是可配置的)。
  • CSR 是使用 FAS 授权证书签名的。
  • Citrix_SmartcardLogon 模板有颁发要求应用程序策略: 证书请求代理。 由于此属性存在于 FAS 授权证书中,因此 CA 会自动颁发用户证书。
  • FAS 检索证书并将其存储在 FAS 服务器上的嵌入式数据库中。
  • 默认情况下,证书的有效期为一周。

稍后,用户证书将提供给 VDA,以供用户登录时使用。

可以使用以下 PowerShell 命令查看之前提到的用于创建密钥对的设置:

Get-FasKeyConfig -Address localhost -CertificateType user

私钥存储选项

可以将 FAS 配置为在三类存储中创建和存储密钥对:

  • 软件:通常使用 Microsoft Software Key Storage Provider,仅由软件提供保护;数据存储在磁盘上。
  • 受信任的平台模块 (TPM):TPM 可以是计算机上的物理硬件,也可以是虚拟机管理程序提供的虚拟 TPM。
  • 硬件安全模块 (HSM):这是一种用于安全存储加密密钥的硬件外围设备或网络设备。

注意:

需要权衡取舍。 硬件存储可能更安全,但通常性能较差,尤其是在创建和存储大量用户证书密钥对时。

与 FAS 授权证书关联的私钥特别敏感,因为证书的策略允许拥有私钥的任何人为任意用户授权证书请求。 因此,任何控制此密钥的人都可以以任意用户的身份连接到环境。

注意:

可以将 Microsoft CA 配置限制 FAS 授权证书的权力,包括可以为其颁发证书的用户集。 请参阅委派注册代理

因此,FAS 允许您独立配置授权和用户证书的私钥属性。

某些典型配置如下:

授权证书密钥 用户证书密钥 备注
软件 软件 默认配置
TPM 软件 授权证书具有硬件保护
HSM HSM 所有证书均有硬件保护

注意:

建议不要将 TPM 用于用户密钥。 请仅将 TPM 用于授权证书密钥。 如果您计划在虚拟化环境中运行 FAS 服务器,请咨询虚拟机管理程序供应商是否支持 TPM 虚拟化。

关键配置 PowerShell 命令

与私钥的配置相关的命令如下:

  • Get-FasKeyConfig
  • Set-FasKeyConfig
  • Reset-FasKeyConfig
  • Test-FasKeyConfig

有关详细信息,请参阅 PowerShell cmdlet

授权和用户证书的密钥配置是独立的,由 CertificateType 参数指定。 例如,要获取申请授权证书(RA 证书)时使用的私钥配置,请运行以下命令:

Get-FasKeyConfig -Address localhost -CertificateType ra

要获取申请用户证书时使用的私钥配置,请运行以下命令:

Get-FasKeyConfig -Address localhost -CertificateType user

可以使用 Set-FasKeyConfigGet-FasKeyConfig 来设置和检查以下私钥属性:

属性 默认值 备注
长度

2048

密钥长度(位)。 请注意,在 Microsoft 模板 GUI 中,加密选项卡指定最小密钥大小。 如果在 FAS 中配置的密钥长度小于在模板中指定的最小密钥大小,CA 将拒绝 CSR。
对于 RSA 密钥,长度可以是 1024 位、2048 位或 4096 位。
对于 ECC 密钥,长度可以是 256 位、384 位或 521 位。
Exportable false 是否可以从其提供程序中导出私钥。
Prefix none 指定要添加到 FAS 生成的私钥标识符的前缀。 生成的标识符由前缀和 GUID 组成。 例如,MyPrefix70277985-6908-4C6F-BE59-B08691456804
EllipticCurve false 如果设置为 true,则生成 ECC 密钥对,否则生成 RSA 密钥对。
密钥存储提供程序 (KSP)
true
如果设置为 true,FAS 将使用新式 Windows CNG API,并且必须在 Provider 属性中指定 KSP。
如果设置为 false,FAS 将使用旧版 CAPI API,并且必须在 Provider 属性中指定加密服务提供程序 (CSP)。 Citrix 建议使用 KSP。
Provider Microsoft Software Key Storage Provider 创建和存储密钥对的提供程序的名称。 可以更改此属性以指定 TPM 或 HSM。 HSM 的 KSP(或 CSP)由 HSM 供应商提供。 他们提供了有关如何安装其软件的说明以及提供程序的名称。
CSPType
24
仅当 KSP 属性设置为 false 时才相关。
请参阅 Microsoft KeyContainerPermissionAccessEntry.ProviderType Property PROV_RSA_AES 24。 除非您将 HSM 与 CSP 结合使用,并且 HSM 提供商另有规定,否则必须始终为 24。

此外,为方便起见,Set-FasKeyConfig 可以与以下开关结合使用:

Flag 说明
-UseDefaultSoftwareProvider Provider 属性设置为 Microsoft Software Key Storage Provider,并将 KSP 字段设置为 true
-UseDefaultTpmProvider Provider 属性设置为 Microsoft Platform Crypto Provider,并将 KSP 字段设置为 true

Microsoft Software Key Storage Provider 是通常用于在磁盘上创建和存储密钥的提供程序。

Microsoft Platform Crypto Provider 是通常用于在 TPM 中创建和存储密钥的提供程序。

Get-FasKeyConfig 还提供字段,这有助于确认正在使用的提供程序和算法:

字段 含义
IsDefaultSoftwareProvider 如果设置为 true,则表示 Provider 设置为 Microsoft Software Key Storage ProviderKSP 字段设置为 true
IsDefaultTpmProvider 如果设置为 true,则表示 Provider 设置为 Microsoft Platform Crypto ProviderKSP 字段设置为 true
Algorithm
RSA 表示将创建 RSA 密钥(EllipticCurve 属性设置为 false)。
ECC 表示将创建 ECC 密钥(EllipticCurve 属性设置为 true)。

可以使用 Reset-FasKeyConfig 将设置还原为默认值。

Reset-FasKeyConfig -Address localhost -CertificateType ra Reset-FasKeyConfig -Address localhost -CertificateType user

注意:

对私钥配置所做的更改(使用 Set-FasKeyConfigReset-FasKeyConfig)将立即应用到新创建的证书。 但是,具有不同配置的现有授权和用户证书不受影响。

可以通过从管理控制台取消授权 FAS 服务来删除现有证书,或者使用取消授权 FAS 并删除 FAS 证书中的 PowerShell 命令来删除现有证书。

密钥池中的任何不符合当前用户密钥配置的预生成密钥都将被丢弃。

配置方案示例

在每个示例中,在授权 FAS 服务之前使用提供的 PowerShell 设置密钥配置,因为现有证书不受任何配置更改的影响。

如果您已经拥有具有错误密钥配置的授权或用户证书,可以通过检查 FAS 证书取消授权 FAS 并删除 FAS 证书来将其删除。

如果您的 FAS 服务器位于实时部署中,请考虑在进行配置更改维护模式时将其置于维护模式。

示例 1 - 将所有密钥都存储在 Microsoft Software Key Storage Provider 中

由于这是默认设置,因此不需要额外的配置。

如果您之前更改过密钥配置,可以通过以下命令还原到使用 Microsoft Software Key Storage Provider

Set-FasKeyConfig -Address localhost -CertificateType ra -UseDefaultSoftwareProvider Set-FasKeyConfig -Address localhost -CertificateType user -UseDefaultSoftwareProvider

可以使用 Reset-FasKeyConfig 还原到 Microsoft Software Key Storage Provider 并将所有其他密钥配置设置还原到默认值。

示例 2 - 将授权证书密钥存储在 TPM 中

此示例说明了如何将 FAS 授权证书密钥存储在 TPM(真实或虚拟)中,而将用户证书密钥存储在 Microsoft Software Key Storage Provider 中。

虽然 FAS 可以使用 TPM 保护的密钥来生成用户证书,但对于大型部署而言,TPM 硬件可能太慢或者大小有限。

请使用以下 PowerShell 命令:

Set-FasKeyConfig -Address localhost -CertificateType ra -UseDefaultTpmProvider Set-FasKeyConfig -Address localhost -CertificateType user -UseDefaultSoftwareProvider

示例 3 - 将所有密钥存储在 HSM 中

此示例说明了如何使用 HSM 存储授权证书和用户证书私钥。 此示例假设已配置 HSM。 您的 HSM 将有一个提供程序名称。 例如,HSM Vendor Key Storage Provider

请使用以下 PowerShell 命令(将示例文本替换为 HSM 提供程序的实际名称):

Set-FasKeyConfig -Address localhost -CertificateType ra -Provider "HSM Vendor Key Storage Provider" Set-FasKeyConfig -Address localhost -CertificateType user -Provider "HSM Vendor Key Storage Provider"

示例 4 - 使用椭圆曲线密钥

默认情况下,FAS 生成 RSA 密钥。 在此示例中,同时为授权证书和用户证书配置了椭圆曲线 (ECC) 密钥。

此示例使用不同的密钥长度。 授权证书配置了长度为 384 位的密钥,用户证书配置了长度为 256 位的密钥。

Set-FasKeyConfig -Address localhost -CertificateType ra -EllipticCurve $true -Length 384 Set-FasKeyConfig -Address localhost -CertificateType user -EllipticCurve $true -Length 256

此时,授权和用户证书请求可能会被 CA 拒绝,因为 FAS 证书模板中的最小密钥大小默认设置为 1024 位。

因此,对于此示例,需要按如下所示更改模板中的最小密钥大小:

  • Citrix_RegistrationAuthority_ManualAuthorization 和 Citrix_RegistrationAuthority:将最小密钥大小更改为 384(或更小)
  • Citrix_SmartcardLogon:将最小密钥大小更改为 256(或更小)

要编辑模板,请运行 mmc.exe 并添加证书模板管理单元。 找到该模板并打开其属性。 最小密钥大小设置位于模板属性的加密选项卡中。

注意:

只有运行 Citrix Virtual Apps and Desktops 2411 或更高版本的 Windows VDA 支持具有 ECC 密钥的用户证书。 Linux VDA 不支持 ECC 密钥。

测试私钥配置

尽管 Set-FasKeyConfig 命令进行了一些验证,但仍然可以设置无效的密钥配置。 例如,您可能输错了 HSM 的提供程序名称,或者您指定的密钥长度可能不受硬件支持。

命令 Test-FasKeyConfig 可以提供帮助。 它尝试使用当前密钥配置创建密钥对,并报告成功失败。 如果出现故障,则会说明故障原因。 如果成功,密钥对将被立即销毁。

以下 PowerShell 命令分别测试授权和用户密钥配置:

Test-FasKeyConfig -Address localhost -CertificateType ra Test-FasKeyConfig -Address localhost -CertificateType user

授权 FAS 服务器并创建规则后,您还可以按如下所示为用户证书创建测试 CSR:

Test-FasCertificateSigningRequest -Address localhost -UserPrincipalName user@example.com -Rule default

将 «user@example.com>/> 替换为来自 Active Directory 部署的真实 UPN。 FAS 规则通常命名为 default。 但是,如果您希望测试已配置的另一条规则,请指定该名称。

如果 CSR 成功,FAS 将丢弃生成的证书。

检查 FAS 证书

可以使用 PowerShell 检查证书的属性并确定关联私钥的存储位置。

检查授权证书

可以通过单击 FAS 管理控制台中的授权证书链接来查看授权证书:

授权证书

但是,如需获取更多详细信息,请使用 PowerShell:

Get-FasAuthorizationCertificate -Address localhost -FullCertInfo

返回了几个字段,包括 PrivateKeyProvider,其中包含创建和存储证书的提供商的指示。

PrivateKeyProvider 密钥的存储位置
Microsoft Software Key Storage Provider 密钥存储在磁盘上,受 Microsoft 软件提供商的保护。
Microsoft Platform Crypto Provider 密钥存储在 TPM(真实或虚拟)中。
HSM Vendor Key Storage Provider(仅示例) 密钥存储在 HSM 中(在此示例中,供应商的提供程序名为 HSM Vendor Key Storage Provider

检查用户证书

可以按如下所示获取 FAS 服务器上缓存的所有用户证书的列表:

Get-FasUserCertificate -Address localhost -KeyInfo $true

KeyInfo 参数导致输出中包含与证书相关联的私钥的更多信息。 特别是,PrivateKeyProvider 字段表示与证书相关联的密钥对的存储位置(有关此值的解释,请参阅上一部分内容)。

可以使用各种可选参数筛选返回的证书集,例如 -UserPrincipalName

命令输出的证书字段为 PEM 编码的用户证书。 将文本复制到 .crt 文件中以使用 Windows 证书 GUI 显示证书,如下所示:

命令 说明
$CertInfos = Get-FasUserCertificate -Address localhost 此列表中可能有多个用户证书
$CertInfo = $CertInfos[0] 在此示例中,我们选择第一个用户证书
$CertInfo.Certificate > c:\temp\user.crt 将 PEM 数据传输到 .crt 文件中
c:\temp\user.crt 在 Windows GUI 中打开 .crt 文件

从 Citrix Virtual Apps and Desktops 2411 之前的 FAS 版本升级

在 Citrix Virtual Apps and Desktops 2411 之前的 FAS 版本中,私钥属性是通过编辑以下位置处的 XML 文件来配置的:

%programfiles%\Citrix\Federated Authentication Service\Citrix.Authentication.FederatedAuthenticationService.exe.config

这已被本文档中介绍的 PowerShell 命令所取代,这些命令提供了更大的灵活性,并且无需重新启动 FAS 服务器即可应用。

此外,与 XML 文件设置不同,使用 PowerShell 完成的配置在 FAS 服务器升级时会保留。

与私钥配置相关的 XML 文件设置及其对应的 PowerShell 参数(在 Get-FasKeyConfigSet-FasKeyConfig 中使用)如下所列:

XML 文件设置 XML 文件中的默认值 Powershell 等效项 备注
Citrix.TrustFabric.ClientSDK.TrustAreaJoinParameters.KeyLength 2048 -Length -
Citrix.TrustFabric.ClientSDK.TrustAreaJoinParameters.KeyProtection

GenerateNonExportableKey

-Exportable
-UseDefaultTpmProvider
  • NoProtection 是通过将 -Exportable 设置为 $true 来实现的
    -GenerateNonExportableKey 是通过将 -Exportable 设置为 $false 来实现的
    -GenerateTPMProtectedKey 是通过指定 -UseDefaultTpmProvider 开关来实现的
Citrix.TrustFabric.ClientSDK.TrustAreaJoinParameters.ProviderLegacyCsp
false
-Ksp
- ProviderLegacyCsp false 是通过将 -Ksp 设置为 $true 来实现的
-ProviderLegacyCsp true 是通过将 -Ksp 设置为 $false 来实现的
Citrix.TrustFabric.ClientSDK.TrustAreaJoinParameters.ProviderName - -Provider -
Citrix.TrustFabric.ClientSDK.TrustAreaJoinParameters.ProviderType - -CspType -

XML 配置默认值和 PowerShell 默认值在功能上是等效的。 也就是说,默认情况下,此版本中的 FAS 生成的密钥对的属性与 Citrix Virtual Apps and Desktops 2411 之前的版本中的密钥对的属性相同。

因此,如果您没有更改 XML 配置文件中的上述任何设置,则在升级 FAS 时无需执行任何操作。

但是,如果您更改了上述任何设置,请按如下所示升级 FAS:

  • 将 FAS 置于维护模式;维护模式
  • 只需运行 FAS 安装程序即可</strong> 原位**升级 FAS;升级后,所有以前的设置都将不存在于 XML 文件中,并且无法在 XML 文件中进行配置。</li>
  • 使用 PowerShell 命令 Set-FasKeyConfig(如密钥配置 PowerShell 命令中所述)根据需要设置 FAS 私钥配置;请考虑授权和用户证书所需的设置。
  • 测试您的配置,如测试私钥配置中所述
  • 使 FAS 服务器退出维护模式</ul>

下次升级时,FAS 私钥配置设置将保留,无需执行任何特殊操作。

加密远程处理

与 FAS 用户证书相关联的私钥绝不会传输到 VDA。 相反,当 VDA 需要使用用户的 FAS 证书(无论是登录 VDA 还是在会话中使用)时,加密请求都会远程传输回 FAS 服务器。 这提高了安全性,因为私钥永远不会离开 FAS 密钥存储(无论是软件存储、TPM 还是 HSM)。

在 Windows VDA 上,这是通过使用 VDA 上的一对提供程序来实现的。 发出加密请求的应用程序或操作系统代码并不知道该操作正在远程传输回 FAS 服务器。

在 Citrix Virtual Apps and Desktops 2411 之前,提供程序为加密服务提供程序 (CSP),其中应用程序和操作系统代码访问是通过较旧的 Windows CAPI API 进行的。 提供程序包括:

  • CitrixLogonCsp.dll:用于单点登录 VDA
  • CitrixVirtualSmartcardCsp.dll:用于会话内证书

自 Citrix Virtual Apps and Desktops 2411 起,VDA 上提供了额外的密钥存储提供程序 (KSP)。 应用程序和操作系统代码使用较新的 Windows CNG API 访问这些内容。 新提供程序包括:

  • CitrixLogonKsp.dll:用于单点登录 VDA
  • CitrixVirtualSmartcardKsp.dll:用于会话内证书

KSP 是一种向 Windows 应用程序公开加密操作的更新方式,它提供了更多功能。 例如:

  • 支持带有 ECC 密钥的证书
  • 支持概率签名方案 (PSS) 填充

如果 FAS 和 VDA 都运行 Citrix Virtual Apps and Desktops 2411 或更高版本,则使用 KSP 远程处理(即通过新 KSP 进行远程处理)。 否则,系统将回退到使用较旧的 CSP 进行远程处理。

禁用 KSP 远程处理

如果出现任何兼容性问题,可以禁用 KSP 远程处理,以便始终使用较旧的 CSP 远程处理。

请使用以下 PowerShell:

Set-FasServer -Address localhost -KspRemoting $false

维护模式

实时 FAS 服务器的配置进行更改时,请考虑将其置于维护模式。

当 FAS 处于维护模式时,会出现以下情况:

  • WorkspaceStoreFront 作为已发布的应用程序或桌面启动序列的一部分调用 FAS 时,FAS 会指示其处于维护模式;调用者必须通过选择其他 FAS 服务器来对此做出反应。
  • 作为额外的预防措施,FAS 不允许在维护模式下自动创建用户证书。 因此可以避免无意中创建具有非预期设置的用户证书。
  • 但是,仍然允许涉及现有用户证书的活动,例如 VDA 登录或会话中使用。

虽然不允许自动创建用户证书,但管理员仍然可以使用 PowerShell 命令(例如 New-FasUserCertificateTest-FasCertificateSigningRequest)创建用户证书。

使用管理控制台

维护模式

使用 PowerShell

请按如下所示将 FAS 服务器置于维护模式:

Set-FasServer -Address localhost -MaintenanceMode $true

请按如下所示使 FAS 服务器退出维护模式(并恢复正常运行):

Set-FasServer -Address localhost -MaintenanceMode $false

相关信息