Citrix Virtual Apps and Desktops

在 VDA 上启用 TLS

通过完成以下任务在 Citrix Workspace 应用程序和 Virtual Delivery Agent (VDA) 之间启用 TLS 连接:

  • 在 VDA 上安装证书。 有关详细信息,请参阅请求和安装证书
  • 在安装 VDA 的计算机上配置 TLS。 (为了方便起见,对安装了 VDA 的计算机的进一步引用简称为“VDA”。) 强烈建议使用 Citrix 提供的 PowerShell 脚本来配置 TLS/DTLS。 有关详细信息,请参阅使用 PowerShell 脚本在 VDA 上配置 TLS。 但是,如果要手动配置 TLS/DTLS,请参阅在 VDA 上手动配置 TLS
  • 通过在 Studio 中运行一组 PowerShell cmdlet,在包含 VDA 的交付组中配置 TLS。 有关详细信息,请参阅在交付组上配置 TLS

要求和注意事项:

  • 在安装组件、创建站点、创建计算机目录和创建交付组之后,在交付组中和 VDA 上配置 TLS。
  • 要在交付组中配置 TLS,必须具有更改 Controller 访问规则的权限。 完全权限管理员具有此权限。
  • 要在 VDA 上配置 TLS,必须是安装 VDA 的计算机上的 Windows 管理员。
  • 在通过 Machine Creation Services 或 Provisioning Services 置备的池 VDA 中,VDA 计算机映像会在重新启动时重置,从而导致以前的 TLS 设置丢失。 请在每次重新启动 VDA 后运行 PowerShell 脚本以重新配置 TLS 设置。

交付组不能既包含已配置 TLS 的 VDA 又包含未配置 TLS 的 VDA。 为交付组配置 TLS 时,确保已经为该交付组中的所有 VDA 配置 TLS

在 VDA 上配置 TLS 时,已安装 TLS 证书上的权限会被更改,向 ICA Service 授予读取证书私钥的权限,并向 ICA Service 告知以下信息:

  • 证书存储中用于 TLS 的证书。

  • 用于 TLS 连接的 TCP 端口号。

    必须将 Windows 防火墙(如果启用)配置为允许此 TCP 端口上的传入连接。 使用 PowerShell 脚本时会完成此配置。

  • 允许哪些版本的 TLS 协议。

    重要:

    Citrix 建议使用 TLS 1.2 或更高版本。 SSL 和较旧版本的 TLS 已弃用。

    支持的 TLS 协议版本遵循以下层次结构(从最低到最高):SSL 3.0、TLS 1.0、TLS 1.1、TLS 1.2 和 TLS 1.3。 指定允许的最低版本;将允许使用此版本或更高版本的所有协议连接。

    例如,如果指定 TLS 1.1 作为最低版本,则允许使用 TLS 1.1、TLS 1.2 和 TLS 1.3 协议连接。 如果指定 SSL 3.0 作为最低版本,则允许所有受支持版本的连接。 如果指定 TLS 1.3 作为最低版本,则仅允许建立 TLS 1.3 连接。

  • 允许哪些 TLS 密码套件。

    密码套件选择用于连接的加密。 客户端和 VDA 可以支持不同的密码套件组。 客户端(Citrix Workspace 应用程序)连接并发送支持的 TLS 密码套件列表,VDA 将客户端的其中一个密码套件与自己的已配置的密码套件列表中的其中一个密码套件进行匹配,并接受连接。 如果没有匹配的密码套件,VDA 将拒绝连接。

    VDA 支持三组密码套件(也称为合规性模式):GOV(ernment)、COM(mercial) 及 ALL。 可接受的密码套件还取决于 Windows FIPS 模式;有关 Windows FIPS 模式的信息,请参阅 http://support.microsoft.com/kb/811833。 下表列出了每组中的密码套件:

    密码套件 ALL COM GOV ALL COM GOV
    FIPS 模式
    TLS_AES_256_GCM_SHA384 X   X X   X
    TLS_AES_128_GCM_SHA256 X     X   X
    TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 X   X X   X
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 X   X X   X
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA X X   X X  

    注意:

    VDA 不支持 DHE 密码套件(例如,TLS_DHE_RSA_WITH_AES_256_GCM_SHA384、TLS_DHE_RSA_WITH_AES_256_CBC_SHA、TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 和 TLS_DHE_RSA_WITH_AES_128_CBC_SHA)。 如果被 Windows 选择,连接将失败。

    如果您使用的是 NetScaler Gateway,请参阅 NetScaler 文档,以了解有关后端通信的密码套件支持的信息。 有关 TLS 密码套件支持的信息,请参阅 Citrix ADC 设备上可用的密码。 有关 DTLS 密码套件支持的信息,请参阅 DTLS 密码支持

请求和安装证书

要使用 TLS,必须安装备用名称包含 VDA 的 FQDN 的证书。 任何直接连接到 VDA(而非通过 Citrix Gateway)的客户端都必须信任该证书。 要允许无法轻松部署证书的非托管设备连接到 VDA,请考虑部署 NetScaler Gateway。

使用 Microsoft 证书颁发机构创建证书

如果您的客户端和 VDA 位于可信林中,并且它具有 Microsoft 证书颁发机构,则可以从证书 MMC 管理单元证书注册向导获取证书。

  1. 在 VDA 上,打开 MMC 控制台并添加“证书”管理单元。 出现提示时,选择“计算机帐户”。
  2. 展开个人 > 证书,然后使用上下文菜单命令所有任务 > 请求新证书
  3. 单击下一步开始,然后单击下一步以确认您正在从 Active Directory 注册中获取证书。
  4. 选择服务器身份验证证书的模板。 默认的 Windows 计算机可导出的 Web 服务器都是可接受的。 如果模板已设置为自动提供“使用者”的值,您可以单击注册,而不提供更多详细信息。

    “请求证书”对话框

  5. 要提供证书模板的更多详细信息,请单击详细信息并配置以下设置:

    使用者名称 - 选择类型公用名并添加 VDA 的 FQDN

    备用名称 - 选择类型 DNS 并添加 VDA 的 FQDN

    证书属性

    注意:

    使用 Active Directory 证书服务证书自动注册可自动颁发证书并将其部署到 VDA。 这在启用证书自动注册中进行了说明。

    可以使用通配符证书允许单个证书保护多个 VDA:

    使用者名称 - 选择类型公用名称并输入 VDA 的 *.primary.domain

    备用名称 - 选择类型 DNS 并添加 VDA 的 *.primary.domain

    “请求证书通配符”对话框

    可以使用 SAN 证书允许单个证书保护多个特定的 VDA:

    使用者名称 - 选择类型公用名并输入一个字符串以帮助识别证书用法

    备用名称 - 选择类型 DNS 并为每个 VDA 的 FQDN 添加一个条目。 请尽量减少备用名称的数量,以确保最佳 TLS 协商效果。

    “请求证书”对话框

    注意:

    通配符和 SAN 证书都要求在“私钥”选项卡上选择 Make private key exportable(使私钥可导出):

    “请求证书”对话框

使用 PowerShell 脚本在 VDA 上配置 TLS

安装证书存储的“本地计算机”>“个人”>“证书”区域中的“TLS 证书”。 如果该位置有多个证书,请向 PowerShell 脚本提供证书的指纹。

注意:

自 XenApp 和 XenDesktop 7.15 LTSR 起,PowerShell 脚本会根据 VDA 的 FQDN 查找正确的证书。 如果该 VDA FQDN 只有一个证书,则不需要提供指纹。

Enable-VdaSSL.ps1 脚本可在 VDA 上启用或禁用 TLS 侦听器。 此脚本位于安装介质上的 Support > Tools > SslSupport 文件夹中。

启用了 TLS 时,将禁用 DHE 密码套件。 ECDHE 密码套件不受影响。

如果启用 TLS,则该脚本会对指定的 TCP 端口禁用所有现有 Windows 防火墙规则。 然后添加一个新规则,允许 ICA Service 只接受 TLS TCP 和 UDP 端口上的传入连接。 它还对以下各项禁用 Windows 防火墙规则:

  • Citrix ICA(默认:1494)
  • Citrix CGP(默认:2598)
  • Citrix WebSocket(默认:8008)

其结果是,用户只能使用 TLS 或 DTLS 进行连接。 如果不使用 TLS 或 DTLS,则他们不能使用 ICA/HDX、已启用会话可靠性的 ICA/HDX 或采用 WebSocket 的 HDX。

注意:

通过 UDP 协议的 ICA/HDX 音频实时传输或 ICA/HDX Framehawk 不支持 DTLS。

请参阅网络端口

此脚本包含以下语法描述以及额外的示例;可以使用 Notepad++ 等工具查看此信息。

重要:

指定 Enable 或 Disable 参数以及 CertificateThumbPrint 参数。 其他参数为可选参数。

语法

Enable-VdaSSL {-Enable | -Disable} -CertificateThumbPrint "<thumbprint>" [-SSLPort <port>] [-SSLMinVersion "<min-ssl-version>"] [-SSLCipherSuite"\<suite>"]

参数 说明
Enable 在 VDA 上安装并启用 TLS 侦听器。 此参数或 Disable 参数为必需参数。
Disable 在 VDA 上禁用 TLS 侦听器。 此参数或 Enable 参数为必需参数。 如果指定此参数,其他参数均无效。
CertificateThumbPrint ‘”thumbprint”’ 证书存储中 TLS 证书的指纹,两边用引号引起。 脚本使用指定的指纹来选择要使用的证书。 如果忽略此参数,则会选择错误的证书。
SSLPort ‘port’ TLS 端口。 默认值:443
SSLMinVersion ‘”version”’ 最低 TLS 协议版本,两边用引号引起。 有效值:SSL_3.0TLS_1.0(默认值)、TLS_1.1TLS_1.2TLS_1.3TLS_1.3 需要 Windows 11 或者 Windows Server 2022 或更高版本。
SSLCipherSuite ‘”suite”’ TLS 密码套件,两边用引号引起。 有效值:”GOV”、”COM” 和 “ALL”(默认值)。

示例

以下脚本安装并启用 TLS 协议版本值。 指纹(在此示例中以 12345678987654321 表示)用于选择要使用的证书。

  Enable-VdaSSL -Enable -CertificateThumbPrint "12345678987654321"

以下脚本安装并启用 TLS 侦听器,指定 TLS 端口 400、GOV 密码套件和最低 TLS 1.2 协议值。 指纹(在此示例中以 12345678987654321 表示)用于选择要使用的证书。

  Enable-VdaSSL -Enable
-CertificateThumbPrint "12345678987654321"
-SSLPort 400 -SSLMinVersion "TLS_1.2"
-SSLCipherSuite "All"

以下脚本在 VDA 上禁用 TLS 侦听器。

  Enable-VdaSSL -Disable

在 VDA 上手动配置 TLS

在 VDA 上手动配置 TLS 时,可以向各个 VDA 上的相应服务授予对 TLS 证书私钥的一般读取权限:NT SERVICE\PorticaService(适用于 Windows 单会话操作系统的 VDA)或者 NT SERVICE\TermService(适用于 Windows 多会话操作系统的 VDA)。 在安装 VDA 的计算机上:

步骤 1. 启动 Microsoft 管理控制台 (MMC):开始 > 运行 > mmc.exe。

步骤 2. 将证书管理单元添加到 MMC:

  1. 选择“文件”>“添加/删除管理单元”。
  2. 选择证书,然后单击添加。
  3. 收到“该管理单元将始终为下列帐户管理证书:”提示时,选择“计算机帐户”,然后单击“下一步”。
  4. 收到“请选择需要这个管理单元管理的计算机”提示时,选择“本地计算机”,然后单击“完成”。

步骤 3. 在证书(本地计算机) > 个人 > 证书下,在证书上单击鼠标右键,然后选择所有任务 > 管理私钥。

步骤 4. 访问控制列表编辑器显示“(FriendlyName) 私钥的权限”,其中 (FriendlyName) 是您的 TLS 证书的名称。 添加以下其中一项服务并向其授予读取权限:

  • 对于适用于 Windows 单会话操作系统的 VDA,“PORTICASERVICE”
  • 对于适用于 Windows 多会话操作系统的 VDA,“TERMSERVICE”

步骤 5. 双击已安装的 TLS 证书。 在证书对话框中,选择详细信息选项卡,然后滚动到底部。 单击指纹。

步骤 6. 运行 regedit 并转到 HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\icawd。

  1. 编辑 SSL 指纹注册表项并将 TLS 证书的指纹值复制到此二进制值中。 可以忽略编辑二进制值对话框中的未知项(如 ‘0000’ 和特殊字符),这样是安全的。
  2. 编辑 SSLEnabled 注册表项并将 DWORD 值更改为 1。 (之后要禁用 SSL,请将 DWORD 值更改为 0。)
  3. 如果要更改默认设置(可选),请在相同注册表路径中使用以下值:

    SSLPort DWORD – SSL 端口号。 默认值:443。

    SSLMinVersion DWORD – 1 = SSL 3.0、2 = TLS 1.0、3 = TLS 1.1、4 = TLS 1.2、5 = TLS 1.3。 默认值:2 (TLS 1.0)。

    SSLCipherSuite DWORD – 1 = GOV、2 = COM、3 = ALL。 默认值:3 (ALL)。

步骤 7. 如果 TLS TCP 和 UDP 端口不是默认的 443,请确保其在 Windows 防火墙中打开。 (在 Windows 防火墙中创建入站规则时,请确保其属性已选中“允许连接”或“启用”条目。)

步骤 8. 确保没有其他应用程序或服务(例如 IIS)正在使用 TLS TCP 端口。

步骤 9. 对于多会话 VDA,请重新启动计算机以使更改生效。 (您不需要重新启动单会话 VDA 计算机。)

步骤 10. 修改 Windows 密码套件首选项,以便 VDA 支持的密码套件具有最高优先级,从而避免出现连接问题。

重要:

下面概述的组策略更改仅在系统重新启动后才会生效。

如果您使用的是通过 MCS 或 PVS 配置的非永久性会话主机,则必须在主映像中应用这些设置。

选项 1:

使用组策略编辑器,转到“计算机配置”>“策略”>“管理模板”>“网络”>“SSL 配置设置”>“SSL 密码套件顺序”。 请确保以下密码套件位于列表顶部:

  TLS_AES_256_GCM_SHA384_P384
TLS_AES_256_GCM_SHA384_P256
TLS_AES_128_GCM_SHA256_P384
TLS_AES_128_GCM_SHA256_P256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384_P384
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384_P256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256
<!--NeedCopy-->

注意:

TLS_AES_256_GCM_SHA384 和 TLS_AES_128_GCM_SHA256 仅适用于 Windows 11 和 Windows Server 2022 或更新版本。 如果您使用的是较旧的操作系统,请不要将这些密码套件包含在您的列表中。

请注意,列出的密码套件还指定椭圆曲线、P384 或 P256,以确保未选择“curve25519”。 FIPS 模式不会阻止使用“curve25519”。

无需从列表中删除任何密码套件。 请注意,这些设置适用于整个系统,因此如果您决定删除任何密码套件,则必须确保会话主机上运行的任何应用程序或服务都不需要这些密码套件。

选项 2:

使用组策略编辑器,转到“计算机配置”>“策略”>“管理模板”>“网络”>“SSL 配置设置”>“SSL 密码套件顺序”。 请确保以下密码套件位于列表顶部:

  TLS_AES_256_GCM_SHA384
TLS_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
<!--NeedCopy-->

注意:

TLS_AES_256_GCM_SHA384 和 TLS_AES_128_GCM_SHA256 仅适用于 Windows 11 和 Windows Server 2022 或更新版本。 如果您使用的是较旧的操作系统,请不要将这些密码套件包含在您的列表中。

无需从列表中删除任何密码套件。 请注意,这些设置适用于整个系统,因此如果您决定删除任何密码套件,则必须确保会话主机上运行的任何应用程序或服务都不需要这些密码套件。

使用组策略编辑器,转到“计算机配置”>“策略”>“管理模板”>“网络”>“SSL 配置设置”>“ECC 曲线顺序”。 启用该设置并将以下曲线包含在列表中:

  NistP384
NistP256
<!--NeedCopy-->

注意:

这确保“curve25519”未选中。 FIPS 模式不会阻止使用“curve25519”。

仅当某个密码套件出现在两个列表中时 VDA 才会选择该密码套件:组策略列表和所选合规模式(COM、GOV 或 ALL)的列表。 该密码套件还必须显示在客户端(Citrix Workspace 应用程序)发送的列表中。

在交付组上配置 TLS

为包含已配置 TLS 连接的 VDA 的每个交付组完成此过程。

  1. 从 Studio,打开 PowerShell 控制台。
  2. 运行 Get-BrokerAccessPolicyRule -DesktopGroupName ‘<delivery-group-name>’ | Set-BrokerAccessPolicyRule -HdxSslEnabled $true
  3. 运行 Set-BrokerSite -DnsResolutionEnabled $true

使用自动注册为池 VDA 启用 SSL

使用池 VDA 时,如果向主映像中添加证书,则所有 VDA 共享相同的映像。 可以使用通配符证书,但缺点是,如果任何一个 VDA 受到损害,此全能证书将意味着属于所有 VDA 的 HDX 连接都将面临风险。

相反,一个安全的替代方法是利用 Microsoft Active Directory 证书服务通过组策略自动配置证书。 可以使用 VDA 上的启动脚本来动态配置新证书并为 VDA 启用 SSL。

请注意,此方法仅适用于单会话桌面 VDA。 对于多会话 VDA,ICA 侦听器在启动过程中、在证书能够自动配置之前启动得过早。

由于 Active Directory 证书服务使用内部企业证书颁发机构,因此它不会被所有 Windows 安装自动信任。 如果客户端由公司管理并且属于域林的一部分,则可以使用组策略自动分发可信 CA 证书。 对于 BYOD 和其他未加入域的设备,您需要通过其他机制(例如提供下载链接)将可信 CA 证书分发给您的用户,或者使用 NetScaler Gateway。

启用证书自动注册

首先确保您在 VDA 域林中提供企业 CA 的服务器上安装了 Active Directory 证书服务角色,否则将无法进行自动注册。

请注意,这可能会给您的企业 CA 带来比平时更高的负载,因为 VDA 每次启动时都会提交证书请求。 请务必在 CA 服务器上分配足够的 CPU 和内存来应对负载,并在投入生产之前在实验室环境中测试部署的可扩展性。

在组策略管理编辑器中,创建一个适用于组织单位的新策略,该组织单位将包含启用了 SSL 的池 VDA,如下所示:

  1. 展开“计算机配置”->“策略”->“Windows 设置”->“安全设置”->“公钥策略”
  2. 编辑“证书服务客户端 - 自动注册策略”对象属性
  3. 按照下面的屏幕截图所示进行配置。
  4. 右键单击“自动证书请求”容器并选择“新建”->“自动证书请求…”
  5. 在“自动证书请求设置”向导中,单击“下一步”
  6. 确保选择了“计算机证书”模板,单击“下一步”
  7. 单击“完成”

注册策略的屏幕截图

准备 Windows 主映像

将 Enable-VdaSsl.ps1 脚本从产品安装介质中的 Support\Tools\SslSupport 文件夹复制到 VDA 主映像。 请注意,主映像不应包含任何用于 HDX SSL 连接的证书。 创建 MCS 或 PVS 计算机目录时将配置证书。 现在创建一个新的计划任务,如下所示(现在请勿运行计划任务):

  1. 打开任务计划程序。

  2. 操作窗格中,按创建任务…

  3. 在“常规”选项卡上:

    • 输入名称,例如 Enable VDA SSL

    • 单击更改用户或组…,在“选择用户或组”对话框中输入 SYSTEM,然后单击确定

    创建任务的“操作”选项卡的屏幕截图

  4. 选择“触发器”选项卡

  5. 单击新建…。 在新建触发器对话框中:

    1. 设置开始任务在事件上

    2. 日志设置为 Microsoft-Windows-CertificateServicesClient-Lifecycle-System/Operational

    3. 设置为 Microsoft-Windows-CertificateServicesClient-Lifecycle-System

    4. 事件 ID 设置为 1006

    5. 单击确定保存触发器

    “新建触发器”窗口的屏幕截图

  6. 选择操作选项卡

  7. 单击新建…

  8. 新建操作对话框中:

    1. 操作设置为启动程序

    2. 在“程序/脚本”字段中,输入 powershell.exe

    3. 在“添加参数”字段中,输入 -ExecutionPolicy RemoteSigned Enable-VdaSsl.ps1 -Enable -Confirm:$False,包括 PowerShell 脚本的路径。

    4. 确定保存操作

    “新建操作”窗口的屏幕截图

  9. 确定保存任务

故障排除

如果出现连接错误,请检查 VDA 上的系统事件日志。

使用适用于 Windows 的 Citrix Workspace 应用程序时,如果收到指示 TLS 错误的连接错误,请禁用 Desktop Viewer,然后重新尝试连接。 尽管连接仍失败,但可能会提供基本 TLS 问题的解释。 例如,您在从证书颁发机构申请证书时指定了错误的模板。)

大多数使用 HDX 自适应传输的配置在使用 DTLS 时能够成功运行,包括使用最新版本的 Citrix Workspace 应用程序、Citrix Gateway 和 VDA 的配置。 某些在 Citrix Workspace 应用程序与 Citrix Gateway 之间使用 DTLS 的配置以及在 Citrix Gateway 与 VDA 之间使用 DTLS 的配置都需要额外的操作。

在以下情况下需要额外的操作:

  • Citrix Receiver 版本支持 HDX 自适应传输和 DTLS:Receiver for Windows(4.7、4.8、4.9)、Receiver for Mac(12.5、12.6、12.7)、Receiver for iOS(7.2、7.3.x)或 Receiver for Linux (13.7)

并且以下任一情况也适用:

  • Citrix Gateway 版本支持通过 DTLS 传输到 VDA,但 VDA 版本不支持 DTLS(版本 7.15 或更低版本),

  • VDA 版本支持 DTLS(版本 7.16 或更高版本),但 Citrix Gateway 版本不支持通过 DTLS 传输到 VDA。

要避免来自 Citrix Receiver 的连接失败,请执行以下操作之一:

  • 将 Citrix Receiver 更新到 Receiver for Windows 4.10 或更高版本、Receiver for Mac 12.8 或更高版本或者 Receiver for iOS 7.5 或更高版本;或
  • 将 Citrix Gateway 更新到支持通过 DTLS 传输到 VDA 的版本;或
  • 将 VDA 更新到版本 7.16 或更高版本;或
  • 在 VDA 上禁用 DTLS;或
  • 禁用 HDX 自适应传输。

注意:

适用于 Receiver for Linux 的更新尚未提供。 Receiver for Android(版本 3.12.3)不支持 HDX 自适应传输以及通过 Citrix Gateway 的 DTLS,因此不受影响。

要在 VDA 上禁用 DTLS,请将 VDA 防火墙配置修改为禁用 UDP 端口 443。 请参阅网络端口

TLS 和 HTML5 视频重定向以及浏览器内容重定向

可以使用 HTML5 视频重定向和浏览器内容重定向来重定向 HTTPS Web 站点。 注入到这些 Web 站点的 JavaScript 必须与 VDA 上运行的 Citrix HDX HTML5 视频重定向服务建立 TLS 连接。 为了实现此功能,HTML5 视频重定向服务将在 VDA 上的证书存储中生成两个自定义证书。 停止此服务将删除证书。

HTML5 视频重定向策略默认处于禁用状态。

浏览器内容重定向默认处于启用状态。

有关 HTML5 视频重定向的详细信息,请参阅多媒体策略设置