私钥保护
简介
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 命令取代,后者提供了更大的灵活性,并且无需重新启动 FAS 服务器即可应用。 此外,与 XML 文件设置不同,使用 PowerShell 进行的配置在 FAS 服务器升级时会保留。 因此,不再支持使用 XML 文件对以下设置进行配置:
Citrix.TrustFabric.ClientSDK.TrustAreaJoinParameters.KeyProtectionCitrix.TrustFabric.ClientSDK.TrustAreaJoinParameters.ProviderLegacyCspCitrix.TrustFabric.ClientSDK.TrustAreaJoinParameters.ProviderNameCitrix.TrustFabric.ClientSDK.TrustAreaJoinParameters.ProviderTypeCitrix.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 充当注册机构,即代表用户请求证书。该证书具有增强型密钥用法 Certificate Request Agent,允许其在请求 FAS 用户证书时用作授权凭据。
-
默认情况下,授权过程使用以下模板:
-
Citrix_RegistrationAuthority_ManualAuthorization:使用此模板创建的证书是临时的、短期有效的,用于引导授权过程; -
Citrix_RegistrationAuthority:使用此模板创建的证书具有较长的有效期,并由 FAS 服务器存储。
授权 FAS 会产生以下步骤:
-
FAS 创建一个密钥对,并向 CA 发送证书签名请求 (CSR),指定密钥对的公钥和模板
Citrix_RegistrationAuthority_ManualAuthorization。 -
模板的颁发要求规定 CSR 必须由 CA 管理员手动批准。
-
- 一旦 CA 管理员批准了 CSR,CA 就会创建一个证书,FAS 会检索该证书。此证书的有效期很短,只有一天,仅用于以下步骤。使用后,FAS 会销毁该证书及其密钥对。
-
FAS 创建另一个密钥对,并向 CA 发送第二个 CSR,指定此密钥对的公钥和模板
Citrix_RegistrationAuthority。该请求由上一步中的证书授权并签名。 -
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 软件密钥存储提供程序,仅通过软件进行保护;数据存储在磁盘上。
- 受信任的平台模块 (TPM):TPM 可以是计算机上的物理硬件,也可以是虚拟机管理程序提供的虚拟 TPM。
- 硬件安全模块 (HSM):这是一种硬件外设或网络设备,旨在安全地存储加密密钥。
注意:
需要权衡利弊。硬件存储可能更安全,但性能通常较低,尤其是在创建和存储大量用户证书密钥对时。
与 FAS 授权证书关联的私钥特别敏感,因为证书策略允许拥有该私钥的任何人授权任何用户的证书请求。因此,控制此密钥的任何人都可以作为任何用户连接到环境。
注意:
Microsoft CA 可配置为限制 FAS 授权证书的权限,包括可为其颁发证书的用户集。请参阅 委派的注册代理。
因此,FAS 允许您独立配置授权证书和用户证书的私钥属性。
一些典型配置如下:
| 授权证书密钥 | 用户证书密钥 | 备注 |
|---|---|---|
| 软件 | 软件 | 默认配置 |
| TPM | 软件 | 授权证书具有硬件保护 |
| HSM | HSM | 所有证书都具有硬件保护 |
注意:
不建议将硬件 TPM 用于用户密钥。仅将 TPM 用于授权证书密钥。如果您计划在虚拟化环境中运行 FAS 服务器,请咨询您的虚拟机管理程序供应商是否支持 TPM 虚拟化。
密钥配置 PowerShell 命令
与私钥配置相关的命令如下:
Get-FasKeyConfigSet-FasKeyConfigReset-FasKeyConfigTest-FasKeyConfig
有关详细信息,请参阅 PowerShell cmdlet。
授权证书和用户证书的密钥配置是独立的,由 CertificateType 参数指定。例如,要获取请求授权证书(RA 证书)时使用的私钥配置:
Get-FasKeyConfig -Address localhost -CertificateType ra
要获取请求用户证书时使用的私钥配置:
Get-FasKeyConfig -Address localhost -CertificateType user
您可以使用 Set-FasKeyConfig 和 Get-FasKeyConfig 设置和检查以下私钥属性:
| 属性 | 默认值 | 备注 |
|---|---|---|
| 长度
|
2048
|
以位为单位的密钥长度。请注意,在 Microsoft 模板 GUI 中,加密选项卡指定最小密钥大小。如果 FAS 中配置的密钥长度小于模板中指定的最小密钥大小,则 CA 将拒绝 CSR。
对于 RSA 密钥,长度可以是 1024 位、2048 位或 4096 位。 对于 ECC 密钥,长度可以是 256 位、384 位或 521 位。 |
| 可导出 | false | 私钥是否可以从其提供程序导出。 |
| 前缀 | none | 指定要添加到 FAS 生成的私钥标识符的前缀。生成的标识符由前缀和 GUID 组成。例如,MyPrefix70277985-6908-4C6F-BE59-B08691456804。 |
| 椭圆曲线 | false | 如果为 true,则生成 ECC 密钥对;否则,生成 RSA 密钥对。 |
| 密钥存储提供程序 (KSP)
|
true
|
如果为 true,FAS 将使用现代 Windows CNG API,并且必须在 Provider 属性中指定 KSP。
如果为 false,FAS 将使用旧版 CAPI API,并且必须在 Provider 属性中指定加密服务提供程序 (CSP)。Citrix 建议使用 KSP。 |
| 提供程序 | Microsoft 软件密钥存储提供程序 | 创建和存储密钥对的提供程序的名称。您可以更改此属性以指定 TPM 或 HSM。HSM 的 KSP(或 CSP)由 HSM 供应商提供。他们提供有关如何安装其软件以及提供程序名称的说明。 |
| CSP 类型
|
24
|
仅当 KSP 属性设置为 false 时才相关。
指 Microsoft KeyContainerPermissionAccessEntry.ProviderType Property PROV_RSA_AES 24。必须始终为 24,除非您使用的是带有 CSP 的 HSM,并且 HSM 供应商另有规定。 |
此外,Set-FasKeyConfig 可与以下开关一起使用,以方便操作:
| 标志 | 说明 |
|---|---|
| -UseDefaultSoftwareProvider | 将 Provider 属性设置为 Microsoft 软件密钥存储提供程序,并将 KSP 字段设置为 true。 |
| -UseDefaultTpmProvider | 将 Provider 属性设置为 Microsoft 平台加密提供程序,并将 KSP 字段设置为 true。 |
Microsoft 软件密钥存储提供程序是通常用于在磁盘上创建和存储密钥的提供程序。
Microsoft 平台加密提供程序是通常用于在 TPM 中创建和存储密钥的提供程序。
- Get-FasKeyConfig 还提供有助于确认正在使用哪个提供程序和算法的字段:
| 字段 | 含义 |
|---|---|
| IsDefaultSoftwareProvider | 如果为 true,则表示提供程序设置为 Microsoft 软件密钥存储提供程序,并且 KSP 字段设置为 true。 |
| IsDefaultTpmProvider | 如果为 true,则表示提供程序设置为 Microsoft 平台加密提供程序,并且 KSP 字段设置为 true。 |
| 算法
|
RSA 表示将创建 RSA 密钥(EllipticCurve 属性为 false)。
ECC 表示将创建 ECC 密钥(EllipticCurve 属性为 true)。 |
您可以使用 Reset-FasKeyConfig 将设置恢复为默认值。
Reset-FasKeyConfig -Address localhost -CertificateType ra
Reset-FasKeyConfig -Address localhost -CertificateType user
<!--NeedCopy-->
注意:
对私钥配置所做的更改(使用
Set-FasKeyConfig或Reset-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-->
默认情况下,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 and 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 (example only) | 密钥存储在 HSM 中(在此示例中,供应商的提供程序名为 HSM Vendor Key Storage Provider) |
检查用户证书
您可以按如下方式获取 FAS 服务器上缓存的所有用户证书列表:
Get-FasUserCertificate -Address localhost -KeyInfo $true
KeyInfo 参数使输出包含有关与证书关联的私钥的更多信息。特别是,PrivateKeyProvider 字段指示与证书关联的密钥对的存储位置(有关解释此值的信息,请参阅上一节)。
您可以使用各种可选参数筛选返回的证书集,例如 -UserPrincipalName。
命令输出的证书字段是 PEM 编码的用户证书。将文本复制到 .crt 文件中,以使用 Windows 证书 GUI 按如下方式显示证书:
| Command | 说明 |
|---|---|
$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-FasKeyConfig 和 Set-FasKeyConfig 中所用):
|**XML 文件设置**|**XML 文件中的默认值**|**Powershell 等效项**|**注释**|
| – | – | – | – |
|Citrix.TrustFabric.ClientSDK.TrustAreaJoinParameters.KeyLength|2048|-Length|-|
|Citrix.TrustFabric.ClientSDK.TrustAreaJoinParameters.KeyProtection|GenerateNonExportableKey|-Exportable |- 通过将 -Exportable 设置为 $true 来实现 NoProtection|
| ^^ | ^^ | ^^ -UseDefaultTpmProvider | ^^ 通过将 -Exportable 设置为 $false 来实现 -GenerateNonExportableKey|
| ^^ | ^^ | ^^ | ^^ 通过指定 -UseDefaultTpmProvider 开关来实现 -GenerateTPMProtectedKey|
|Citrix.TrustFabric.ClientSDK.TrustAreaJoinParameters.ProviderLegacyCsp|false|-Ksp| - 通过将-Ksp 设置为 $true 来实现 -ProviderLegacyCspfalse|
| ^^ | ^^ | ^^ | ^^ 通过将 -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 之前,提供程序是 Cryptographic Service Providers (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 处于维护模式时,以下情况成立:
- 当 Workspace 或 StoreFront™ 在已发布的应用程序或桌面启动序列中调用 FAS 时,FAS 会指示其处于维护模式;调用者必须通过选择不同的 FAS 服务器来对此做出反应。
- 作为额外的预防措施,FAS 不允许在维护模式下自动创建用户证书。从而避免了意外创建具有非预期设置的用户证书。
- 但是,涉及现有用户证书的活动,例如 VDA 登录或会话内使用,仍然允许。
尽管不允许自动创建用户证书,但管理员仍可以使用 PowerShell 命令(例如 New-FasUserCertificate 或 Test-FasCertificateSigningRequest)创建用户证书。
使用管理控制台

使用 PowerShell
将 FAS 服务器置于维护模式,如下所示:
Set-FasServer -Address localhost -MaintenanceMode \$true
使 FAS 服务器退出维护模式(并恢复正常运行),如下所示:
Set-FasServer -Address localhost -MaintenanceMode \$false
相关信息
- 安装和配置是 FAS 安装和配置的主要参考。
- 常见的 FAS 部署在联合身份验证服务体系结构概述文章中进行了总结。
- 其他操作方法文章在高级配置文章中介绍。