私钥保护

简介

FAS 证书存储在 FAS 服务器上的嵌入式数据库中。与 FAS 证书关联的私钥存储在 FAS 服务器的网络服务帐户下。默认情况下,这些密钥是不可导出的 2048 位 RSA 密钥,在 Microsoft 软件密钥存储提供程序中创建和存储。

使用 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 命令取代,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 管理员手动批准。

    1. CA 管理员批准 CSR 后,CA 会创建一个证书,FAS 会检索该证书。此证书的有效期很短,只有一天,并且仅用于以下步骤。使用后,FAS 会销毁该证书及其密钥对。
  1. FAS 创建另一个密钥对,并向 CA 发送第二个 CSR,其中指定此密钥对的公钥和模板 Citrix_RegistrationAuthority。该请求由上一步中的证书授权并签名。

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

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

Get-FasKeyConfig -Address localhost -CertificateType ra

FAS 用户证书

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

当 FAS 创建用户证书时,会发生以下步骤:

  • FAS 创建一个密钥对,并向 CA 发送 CSR,其中指定密钥对的公钥、用户身份以及默认模板 Citrix_SmartcardLogon(使用的模板可配置)。
  • CSR 使用 FAS 授权证书签名。
  • Citrix_SmartcardLogon 模板具有颁发要求 Application Policy: Certificate Request Agent。由于此属性存在于 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 来设置和检查以下私钥属性:

属性 默认值 备注
Length

2048

密钥长度(以位为单位)。请注意,在 Microsoft 模板 GUI 中,Cryptograhy 选项卡指定了最小密钥大小。如果 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 密钥对。
Key Storage Provider (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。除非您使用带有 CSP 的 HSM 并且 HSM 供应商另有指定,否则必须始终为 24。

此外,Set-FasKeyConfig 可与以下开关一起使用,以提供便利:

标志 说明
-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,则表示提供程序设置为 Microsoft Software Key Storage Provider,并且 KSP 字段设置为 true
IsDefaultTpmProvider 如果为 true,则表示提供程序设置为 Microsoft Platform Crypto Provider,并且 KSP 字段设置为 true
Algorithm
RSA 表示将创建 RSA 密钥(EllipticCurve 属性为 false)。
ECC 表示将创建 ECC 密钥(EllipticCurve 属性为 true)。

您可以使用 Reset-FasKeyConfig 将设置恢复为默认值。

Reset-FasKeyConfig -Address localhost -CertificateType ra
Reset-FasKeyConfig -Address localhost -CertificateType user
<!--NeedCopy-->

注意:

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

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

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

配置方案示例

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

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

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

示例 1 - 将所有密钥存储在 Microsoft 软件密钥存储提供程序中

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

如果您之前更改了密钥配置,可以使用以下命令恢复为使用 Microsoft 软件密钥存储提供程序

Set-FasKeyConfig -Address localhost -CertificateType ra -UseDefaultSoftwareProvider
Set-FasKeyConfig -Address localhost -CertificateType user -UseDefaultSoftwareProvider
<!--NeedCopy-->

您可以使用 Reset-FasKeyConfig 恢复为 Microsoft 软件密钥存储提供程序,并额外将所有其他密钥配置设置恢复为默认值。

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

此示例说明了如何将 FAS 授权证书密钥存储在 TPM(物理或虚拟)中,而用户证书密钥存储在 Microsoft 软件密钥存储提供程序中。

尽管 FAS 可以生成具有 TPM 保护密钥的用户证书,但对于大型部署而言,TPM 硬件可能速度太慢或大小受限。

使用以下 PowerShell 命令:

Set-FasKeyConfig -Address localhost -CertificateType ra -UseDefaultTpmProvider
Set-FasKeyConfig -Address localhost -CertificateType user -UseDefaultSoftwareProvider
<!--NeedCopy-->

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

此示例说明了如何使用 HSM 存储授权证书和用户证书私钥。此示例假定已配置 HSM。您的 HSM 将具有提供程序名称。例如,HSM 供应商密钥存储提供程序

使用以下 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"
<!--NeedCopy-->
  • 示例 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
<!--NeedCopy-->

此时,授权和用户证书请求可能会被 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
<!--NeedCopy-->

授权 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
<!--NeedCopy-->

这已被本文档中介绍的 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
通过将 -Exportable 设置为 $true 来实现 NoProtection
通过将 -Exportable 设置为 $false 来实现 -GenerateNonExportableKey
通过指定 -UseDefaultTpmProvider 开关来实现 -GenerateTPMProtectedKey
Citrix.TrustFabric.ClientSDK.TrustAreaJoinParameters.ProviderLegacyCsp
false
-Ksp
通过将 -Ksp 设置为 $true 来实现 -ProviderLegacyCsp false
通过将 -Ksp 设置为 $false 来实现 -ProviderLegacyCsp true
Citrix.TrustFabric.ClientSDK.TrustAreaJoinParameters.ProviderName - -Provider -
Citrix.TrustFabric.ClientSDK.TrustAreaJoinParameters.ProviderType - -CspType -

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

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

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

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

下次升级时,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

相关信息

私钥保护