XenApp and XenDesktop

传输层安全性 (TLS)

将 XenApp 或 XenDesktop 站点配置为使用传输层安全性 (TLS) 协议包括以下过程:

  • 获取服务器证书并在所有 Delivery Controller 上安装和注册,并使用 TLS 证书配置端口。有关详细信息,请参阅在 Controller 上安装 TLS 服务器证书

    (可选)可以更改 Controller 用于侦听 HTTP 和 HTTPS 流量的端口。

  • 通过完成以下任务在用户和 Virtual Delivery Agents (VDA) 之间启用 TLS 连接:

    要求和注意事项:

    • 在用户和 VDA 之间启用 TLS 连接仅对 XenApp 7.6 和 XenDesktop 7.6 及后续受支持的版本有效。
    • 在安装组件、创建站点、创建计算机目录和创建交付组之后,在交付组中和 VDA 上配置 TLS。
    • 要在交付组中配置 TLS,必须具有更改 Controller 访问规则的权限。完全权限管理员具有此权限。
    • 要在 VDA 上配置 TLS,必须是安装 VDA 的计算机上的 Windows 管理员。
    • 如果打算在从早期版本升级的 VDA 上配置 TLS,请在升级之前卸载这些计算机上的 SSL Relay 软件。
    • PowerShell 脚本在静态 VDA 上配置 TLS,不会在通过 Machine Creation Services 或 Provisioning Services 预配的池 VDA 上配置 TLS。对于第二种情况,计算机映像在每次重新启动时重置。

警告:

有关涉及在 Windows 注册表中操作的任务 - 注册表编辑不当会导致严重问题,可能需要重新安装操作系统。Citrix 无法保证因注册表编辑器使用不当导致出现的问题能够得以解决。使用注册表编辑器需自担风险。在编辑注册表之前,请务必进行备份。

有关为站点数据库启用 TLS 的信息,请参阅 CTX137556

注意:

如果同时在 VDA 上启用了 TLS 和 UDT:

  • 如果直接访问 VDA,Citrix Receiver 将始终使用 TLS over TCP(而非 UDP 和 UDT)。
  • 如果使用 NetScaler Gateway 间接访问 VDA,Citrix Receiver 将使用 DTLS over UDP 与 NetScaler Gateway 进行通信。NetScaler Gateway 与 VDA 之间的通信使用 UDP,但不使用 DTLS。 使用 UDT。

在 Controller 上安装 TLS 服务器证书

对于 HTTPS,XML Service 通过使用服务器证书而非客户端证书来支持 TLS 功能。本部分内容介绍如何在 Delivery Controller 中获取和安装 TLS 证书。同样的步骤可以应用到 Cloud Connector 以加密 STA 和 XML 流量。

有各种不同类型的证书颁发机构以及从这些机构请求证书的方法,本文介绍了 Microsoft 证书颁发机构。Microsoft 证书颁发机构需要发布证书模板以便进行服务器身份验证。

如果 Microsoft 证书颁发机构集成到 Active Directory 域或 Delivery Controller 加入到的可信林中,则可以从证书 MMC 管理单元证书注册向导获取证书。

请求和安装证书

  1. 在 Delivery Controller 上,打开 MMC 控制台并添加“证书”管理单元。出现提示时,选择“计算机帐户”。
  2. 展开个人 > 证书,然后使用所有任务 > 申请新证书上下文菜单命令。

    MMC 证书管理单元

  3. 单击下一步开始,然后单击下一步以确认您正在从 Active Directory 注册中获取证书。
  4. 选择服务器身份验证证书的模板。如果模板已设置为自动提供“使用者”的值,您可以单击注册,而不提供更多详细信息。

    “请求证书”对话框

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

    使用者名称:选择公用名并添加 Delivery Controller 的 FQDN。

    备用名称:选择 DNS 并添加 Delivery Controller 的 FQDN。

    证书属性

配置 SSL/TLS 侦听器端口

  1. 以计算机管理员身份打开 PowerShell 命令窗口。
  2. 运行以下命令以获取 Broker Service 应用程序 GUID:

    New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT
    
    $Service_Guid = Get-ChildItem HKCR:\Installer\Products -Recurse -Ea 0 | Where-Object { $key = $\_; $\_.GetValueNames() | ForEach-Object { $key.GetValue($\_) } | Where-Object { $\_ -like 'Citrix Broker Service' } } | Select-Object Name
    
    $Service_Guid.Name -match "[A-Z0-9]*$"
    
    $Guid = $Matches[0]
    
    [GUID]$Formatted_Guid = $Guid
    
    Remove-PSDrive -Name HKCR
    
    Write-Host "Broker Service Application GUID: $($Formatted_Guid)" -ForegroundColor Yellow
    <!--NeedCopy-->
    
  3. 在同一 PowerShell 窗口中运行以下命令以获取之前安装的证书的指纹:

    $HostName = ([System.Net.Dns]::GetHostByName(($env:computerName))).Hostname
    
    $Thumbprint = (Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.Subject -match ("CN=" + $HostName)}).Thumbprint -join ';'
    
    Write-Host -Object "Certificate Thumbprint for $($HostName): $($Thumbprint)" -Foreground Yellow
    <!--NeedCopy-->
    
  4. 在同一 PowerShell 窗口中运行以下命令,以配置 Broker Service SSL/TLS 端口和用户证书以进行加密:

    $IPV4_Address = Test-Connection -ComputerName $HostName -Count 1  | Select-Object -ExpandProperty IPV4Address
    
    $IPPort = "$($IPV4_Address):443"
    
    $SSLxml = "http add sslcert ipport=$IPPort certhash=$Thumbprint appid={$Formatted_Guid}"
    
    $SSLxml | netsh
    
    . netsh http show sslcert
    <!--NeedCopy-->
    

正确配置后,最后一个命令 .netsh http show sslcert 的输出显示监听器正在使用正确的 IP:port,并且 Application ID 与 Broker Service 应用程序 GUID 匹配。

如果服务器信任 Delivery Controller 上安装的证书,您现在可以将 StoreFront Delivery Controller 和 Citrix Gateway STA 绑定配置为使用 HTTPS 而非 HTTP。

密码套件顺序列表应包括 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 密码套件(或两者)。这些密码套件必须位于任何 TLS_DHE_ 密码套件之前。

注意:

Windows Server 2012 不支持 GCM 密码套件 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

  1. 使用 Microsoft 组策略编辑器,浏览至计算机配置 > 管理模板 > 网络 > SSL 配置设置
  2. 编辑策略 SSL 密码套件顺序。默认情况下,此策略设置为未配置。将此策略设置为已启用
  3. 按正确的顺序安排套件,删除任何不需要使用的密码套件。

确保 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 位于任何 TLS_DHE_ 密码套件之前。

在 Microsoft MSDN 上,另请参阅 Prioritizing Schannel Cipher Suites(Schannel 密码套件优先级划分)。

更改 HTTP 或 HTTPS 端口

默认情况下,Controller 上的 XML Service 在端口 80 上侦听 HTTP 流量,在端口 443 上侦听 HTTPS 流量。尽管可以使用非默认端口,但请注意:将 Controller 暴露在不受信任的网络上存在安全风险。部署独立 StoreFront 服务器比更改默认值更可取。

要更改 Controller 使用的默认 HTTP 或 HTTPS 端口,请从 Studio 运行以下命令:

BrokerService.exe -WIPORT http-port -WISSLPORT https-port

其中,http-port 是用于 HTTP 流量的端口号,https-port 是用于 HTTPS 流量的端口号。

更改端口后,Studio 可能会显示关于许可证兼容性和升级的消息。要解决此问题,请使用以下 PowerShell cmdlet 序列重新注册服务实例:

Get-ConfigRegisteredServiceInstance -ServiceType Broker -Binding XML_HTTPS |

Unregister-ConfigRegisteredServiceInstance

Get-BrokerServiceInstance | where Binding -eq “XML_HTTPS” | Register-ConfigServiceInstance

仅会强制执行 HTTPS 流量

如果希望 XML Service 忽略默认端口上的 HTTP 流量,请在 Controller 上的 HKLM\Software\Citrix\DesktopServer\ 中创建以下注册表设置,然后重新启动 Broker Service。

要忽略 HTTP 流量,请创建 DWORD XmlServicesEnableNonSsl 并将其设置为 0。

提供了一个能够创建的用于忽略 HTTPS 流量的相应注册表 DWORD 值:DWORD XmlServicesEnableSsl。请确保未将其设置为 0。

VDA 上的 TLS 设置

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

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

  • 证书存储中用于 TLS 的证书
  • 用于 TLS 连接的 TCP 端口号

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

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

重要

Citrix 建议您查看您的 SSLv3 使用情况,并在适当的情况下重新配置那些部署以删除对 SSLv3 的支持。请参阅 CTX200238

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

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

  • 允许哪些 TLS 密码套件。

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

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

TLS 密码套件 GOV COM ALL GOV COM ALL
FIPS 模式
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_RSA_WITH_AES_256_GCM_SHA384 x   x x   x
TLS_RSA_WITH_AES_128_GCM_SHA256 x x x x x x
TLS_RSA_WITH_AES_256_CBC_SHA256 x   x x   x
TLS_RSA_WITH_AES_256_CBC_SHA x   x x   x
TLS_RSA_WITH_AES_128_CBC_SHA   x x   x x
TLS_RSA_WITH_RC4_128_SHA   x x      
TLS_RSA_WITH_RC4_128_MD5   x x      
TLS_RSA_WITH_3DES_EDE_CBC_SHA x   x x   x

重要:

VDA 在 Windows Server 2012 R2、Windows Server 2016 或者 Windows 10 Anniversary Edition 或支持的更高版本上时,需要执行额外的步骤。这影响来自 Citrix Receiver for Windows(版本 4.6 到 4.9)、Citrix Receiver for HTML5 以及 Citrix Receiver for Chrome 的连接。其中也包括通过 NetScaler Gateway 建立的连接。

对于使用 NetScaler Gateway 的所有连接以及所有 VDA 版本(如果在 NetScaler Gateway 与 VDA 之间配置了 TLS),也需要执行此步骤。这影响所有 Citrix Receiver 版本。

在 VDA(Windows Server 2016 或 Windows 10 Anniversary Edition 或更高版本)上,使用组策略编辑器,转到计算机配置 > 管理模板 > 网络 > SSL 配置设置 > SSL 密码套件顺序。选择以下顺序:

  • 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_RSA_WITH_AES_256_GCM_SHA384
  • TLS_RSA_WITH_AES_128_GCM_SHA256
  • TLS_RSA_WITH_AES_256_CBC_SHA256
  • TLS_RSA_WITH_AES_256_CBC_SHA
  • TLS_RSA_WITH_AES_128_CBC_SHA
  • TLS_RSA_WITH_RC4_128_SHA
  • TLS_RSA_WITH_3DES_EDE_CBC_SHA

注意:

前四项还指定椭圆曲线 P384 或 P256。请确保未选择 “curve25519”。FIPS 模式不会阻止使用 “curve25519”。

配置了此组策略设置时,VDA 将仅选择同时显示在两个列表中的密码套件:组策略列表和选定合规性模式列表(COM、GOV 或 ALL)。该密码套件还必须显示在客户端(Citrix Receiver 或 StoreFront)发送的列表中。

此组策略配置还会影响 VDA 上的其他 TLS 应用程序和服务。如果您的应用程序要求使用特定的密码套件,您可能需要将它们添加到此组策略列表中。

重要:

尽管组策略更改一旦应用便会显示,但对 TLS 配置的组策略更改只有在重新启动操作系统后才会生效。因此,对于池桌面,请将对 TLS 配置的组策略更改应用于基础映像。

使用 PowerShell 脚本在 VDA 上配置 TLS

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

启用 TLS 时,此脚本为指定的 TCP 端口禁用现有的所有 Windows 防火墙规则,然后添加新规则以允许 ICA Service 仅接受 TLS TCP 端口上的传入连接。它还对以下各项禁用 Windows 防火墙规则:

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

产生的影响为用户只能使用 TLS 进行连接;在不使用 TLS 的情况下,不能使用 ICA/HDX、启用了会话可靠性的 ICA/HDX 或采用 WebSocket 的 HDX。

请参阅网络端口

注意:

对于无状态计算机(例如 PVS 目标或 MCS 克隆),默认情况下使用 FQDN 证书。

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

重要:

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

语法

Enable-VdaSSL {-Enable | -Disable} -CertificateThumbPrint "<thumbprint>"
[–SSLPort <port>] [-SSLMinVersion "<min-ssl-version>"] [-SSLCipherSuite"<suite>"]
<!--NeedCopy-->
参数 说明
启用 在 VDA 上安装并启用 TLS 侦听器。此参数或 Disable 参数为必需参数。
禁用 在 VDA 上禁用 TLS 侦听器。此参数或 Enable 参数为必需参数。如果指定此参数,其他参数均无效。
CertificateThumbPrint “" 证书存储中 TLS 证书的指纹,两边用引号引起。脚本使用指定的指纹来选择要使用的证书。如果忽略此参数,则会选择错误的证书。
SSLPort TLS 端口。默认值:443
SSLMinVersion “" 最低 TLS 协议版本,两边用引号引起。有效值:”SSL_3.0”、”TLS_1.0”(默认值)、”TLS_1.1” 和 “TLS_1.2”。重要: Citrix 建议客户查看其 SSLv3 的使用情况,并在适当的情况下重新配置其部署以删除对 SSLv3 的支持。请参阅 CTX200238
SSLCipherSuite “" TLS 密码套件,两边用引号引起。有效值:”GOV”、”COM” 和 “ALL”(默认值)

示例

以下脚本安装并启用 TLS 1.2 协议版本值。指纹(在此示例中以 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(适用于 VDA for Windows Desktop OS)或者 NT SERVICE\TermService(适用于 VDA for Windows Server OS)。在安装 VDA 的计算机上:

  1. 启动 Microsoft 管理控制台 (MMC):开始 > 运行 > mmc.exe
  2. 将证书管理单元添加到 MMC:

    1. 选择文件 > 添加/删除管理单元
    2. 选择证书,然后单击添加
    3. 收到该管理单元将始终为下列帐户管理证书: 提示时,选择计算机帐户,然后单击下一步
    4. 收到请选择需要这个管理单元管理的计算机提示时,选择本地计算机,然后单击完成
  3. 证书(本地计算机) > 个人 > 证书下,在证书上单击鼠标右键,然后选择所有任务 > 管理私钥

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

    • 对于 VDA for Windows Desktop OS:”PORTICASERVICE”
    • 对于 VDA for Windows Server OS:”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。默认值:2 (TLS 1.0)。

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

  7. 如果 TLS TCP 端口不是默认值 443,请确保此端口在 Windows 防火墙中处于打开状态。(在 Windows 防火墙中创建入站规则时,请确保其属性已选中允许连接启用条目)。

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

  9. 对于 VDA for Windows Server OS,重新启动计算机以使更改生效。(无需重新启动包含 VDA for Windows Desktop OS 的计算机)。

在交付组上配置 TLS

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

  1. 从 Studio,打开 PowerShell 控制台。
  2. 运行 asnp Citrix.* 以加载 Citrix 产品 cmdlet。
  3. 运行 Get-BrokerAccessPolicyRule -DesktopGroupName 'delivery-group-name' | Set-BrokerAccessPolicyRule -HdxSslEnabled $true
  4. 运行 Set-BrokerSite -DnsResolutionEnabled $true

故障排除

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

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

Controller 与 VDA 之间的通信

Controller 与 VDA 之间的通信通过 Windows Communication Framework (WCF) 消息级保护来确保安全。不需要执行使用 TLS 的传输层保护。WCF 配置使用 Kerberos 在 Controller 与 VDA 之间进行相互身份验证。加密使用处于 CBC 模式的带 256 位密钥的 AES。消息完整性使用 SHA-1。

根据 Microsoft,WCF 所使用的安全协议符合 OASIS(结构化信息标准促进组织)标准,包括 WS-SecurityPolicy 1.2。 此外,Microsoft 还申明,WCF 支持安全策略 1.2 中列出的所有算法套件。

Controller 和 VDA 间的通信使用 basic256 算法套件,该套件的算法如上所述。

TLS 和 HTML5 视频重定向

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

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

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