SSL拦截
为SSL拦截配置的Citrix ADC设备充当代理。它可以拦截和解密SSL/TLS流量,检查未加密的请求,并使管理员能够强制执行遵从性规则和安全检查。SSL拦截使用策略来指定拦截、阻止或允许哪些流量。例如,进出金融网站(如银行)的流量一定不能被拦截,但其他流量可以被拦截,黑名单网站可以被识别和屏蔽。Citrix建议您配置一个通用策略来拦截流量,并配置更具体的策略来绕过某些流量。
客户端和代理建立HTTPS/TLS握手。代理与服务器建立另一次HTTPS/TLS握手,并接收服务器证书。代理代表客户端验证服务器证书,并通过OCSP (Online certificate Status Protocol)协议检查服务器证书的有效性。它重新生成服务器证书,使用设备上安装的CA证书的密钥对其进行签名,并将其呈现给客户机。因此,在客户端和Citrix ADC设备之间使用一个证书,在设备和后端服务器之间使用另一个证书。
重要的
所有客户端设备上必须预先安装用于签署服务端证书的CA证书,以保证重新生成的服务端证书受客户端信任。
对于拦截的HTTPS流量,代理服务器对出流量进行解密,访问明文HTTP请求,并可以使用任何七层应用程序来处理流量,例如通过查看明文URL并根据公司策略和URL信誉允许或阻止访问。如果策略决定允许访问源服务器,代理服务器将重新加密的请求转发到目标服务(在源服务器上)。代理解密来自源服务器的响应,访问明文HTTP响应,并可选地对响应应用任何策略。然后代理重新加密响应并将其转发给客户端。如果策略决定阻止对源服务器的请求,代理可以向客户端发送错误响应,例如HTTP 403。
要执行SSL拦截,除了前面配置的代理服务器外,还必须在ADC设备上配置以下内容:
- SSL配置文件
- SSL政策
- CA证书存储
- ssl错误自动学习和缓存
注意:
HTTP/2流量不被SSL拦截特性拦截。
SSL拦截证书存储
SSL证书是任何SSL事务的一部分,它是一种数字数据形式(X509),用于标识公司(域)或个人。SSL证书由CA (certificate authority)颁发。CA可以是私有的也可以是公共的。由公共ca(如Verisign)颁发的证书受到执行SSL事务的应用程序的信任。这些应用程序维护一个它们信任的ca列表。
作为转发代理,ADC设备对客户机和服务器之间的通信执行加密和解密。它对客户机(用户)充当服务器,对服务器充当客户机。在设备可以处理HTTPS通信之前,它必须验证服务器的身份,以防止任何欺诈性交易。因此,作为源服务器的客户机,设备必须在接受源服务器证书之前验证它。要验证服务器证书,设备上必须存在用于签署和颁发服务器证书的所有证书(例如根证书和中间证书)。设备上预安装了一组默认的CA证书。设备可以使用这些证书来验证几乎所有通用的源服务器证书。此默认设置不可修改。但是,如果您的部署需要更多的CA证书,您可以创建这样的证书束,并将该束导入设备。一个包也可以包含单个证书。
当您将证书包导入设备时,设备会从远程位置下载该包,并在验证该包仅包含证书后将其安装到设备上。必须先应用证书包,然后才能使用它来验证服务器证书。您还可以导出证书包进行编辑,或将其作为备份存储在脱机位置。
通过使用CLI在设备上导入和应用CA证书包
在命令提示符下,输入:
导入ssl certBundle 应用ssl certBundle
show ssl certBundle
参数:
名字:
要分配给导入的证书包的名称。必须以ASCII字母数字或下划线(_)开头,且只能包含ASCII字母数字、下划线、哈希(#)、句号(.)、空格、冒号(:)、@、等号(=)和连字符(-)。以下要求仅适用于CLI:
如果名称包含一个或多个空格,请将名称用双引号或单引号括起来(例如,“my file”或“my file”)。
最大长度:31
src:
指定要导入或导出的证书包的协议、主机和路径(包括文件名)的URL。例如,http://www.example.com/cert_bundle_file
.
请注意:如果导入对象位于需要客户端证书认证的HTTPS服务器上,则导入失败。
最大长度:2047
例子:
导入ssl certbundle swg-certbundle http://www.example.com/cert_bundle应用ssl certbundle swg-certbundle——NeedCopy >
show ssl certbundle Name: swg-certbundle(Inuse) URL: http://www.example.com/cert_bundle Done
通过使用GUI在设备上导入和应用CA证书包
- 导航到安全> SSL正向代理>入门>证书包.
- 做以下其中一件事:
- 从列表中选择一个证书包。
- 要添加证书包,请单击“+”并指定名称和源URL。点击好吧.
- 点击好吧.
通过使用CLI从设备中删除CA证书包
在命令提示符下,输入:
remove certBundle
例子:
删除certBundle——NeedCopy >
使用CLI从设备导出CA证书包
在命令提示符下,输入:
export certBundle <证书包名称> <导出路径>
参数:
名字:
要分配给导入的证书包的名称。必须以ASCII字母数字或下划线(_)开头,且只能包含ASCII字母数字、下划线、哈希(#)、句号(.)、空格、冒号(:)、@、等号(=)和连字符(-)。以下要求仅适用于CLI:
如果名称包含一个或多个空格,请将名称用双引号或单引号括起来(例如,“my file”或“my file”)。
最大长度:31
src:
指定要导入或导出的证书包的协议、主机和路径(包括文件名)的URL。例如,http://www.example.com/cert_bundle_file
.
请注意:如果导入对象位于需要客户端证书认证的HTTPS服务器上,则导入失败。
最大长度:2047
例子:
export certBundle mytest-cacert http://192.0.2.20/
从Mozilla CA证书存储库导入、应用和验证CA证书包
在命令提示符下,输入:
> import certbundle mozilla_public_ca https://curl.haxx.se/ca/cacert.pem Done
要应用这个包,输入:
apply certbundle mozilla_public_ca Done
要验证正在使用的证书包,请键入:
> sh certbundle | grep mozilla Name: mozilla_public_ca (Inuse)
限制
- 在集群设置或分区设备中不支持证书包。
- SSL正向代理不支持TLSv1.3协议。
用于SSL拦截的SSL策略基础设施
策略的作用类似于传入流量的过滤器。ADC设备上的策略有助于定义如何管理代理连接和请求。处理基于为该策略配置的操作。也就是说,将连接请求中的数据与策略中指定的规则进行比较,并将操作应用于匹配规则(表达式)的连接。在定义要分配给策略的动作并创建策略之后,必须将其绑定到代理服务器,以便将其应用于流经该代理服务器的流量。
用于SSL拦截的SSL策略评估传入流量,并对匹配规则(表达式)的请求应用预定义的操作。拦截、绕过或重置连接的决定是基于定义的SSL策略做出的。您可以为策略配置以下三种动作之一:拦截、绕过或重置。创建策略时必须指定操作。要使策略生效,必须将其绑定到设备上的代理服务器。要指定策略用于SSL拦截,必须在将策略绑定到代理服务器时将类型(绑定点)指定为INTERCEPT_REQ。当解绑定策略时,必须指定类型为INTERCEPT_REQ。
请注意:
除非指定策略,否则代理服务器无法决定是否进行拦截。
流量拦截可以基于任何SSL握手属性。最常用的是SSL域。SSL域通常由SSL握手的属性表示。它可以是从SSL客户端Hello消息中提取的服务器名称指示值(如果存在),也可以是从源服务器证书中提取的服务器备选名称(SAN)值。SSL拦截策略提供了一个特殊的属性DETECTED_DOMAIN。此属性使客户更容易根据源服务器证书的SSL域编写拦截策略。客户可以将域名与字符串、URL列表(URL集)或patset
),或从域派生的URL类别。
使用CLI方式创建SSL策略
在命令提示符下,输入:
添加SSL策略 -rule -action
例子:
的表达式的策略的示例如下detected_domain
属性来检查域名。
不要拦截到金融机构的流量,如XYZBANK
添加ssl策略pol1 -rule client.ssl.detected_domain.contains("XYZBANK") -action BYPASS
不允许用户从公司网络连接到YouTube
添加ssl策略pol2 -rule client.ssl.client.ssl.detected_domain.url_categorize(0,0).category.eq ("YouTube") -action RESET
拦截所有用户流量
添加ssl策略pol3 -rule true -action拦截
如果客户不想使用detected_domain,他们可以使用任何SSL握手属性来提取和推断域。
例如,在客户端hello消息的SNI扩展中找不到域名。域名必须取自源服务器证书。以下示例适用于使用表达式检查源服务器证书的主题名称中的域名的策略。
拦截所有用户流量到任何雅虎域名
添加ssl策略pol4 -rule client.ssl.origin_server_cert.subject.contains("yahoo") -action拦截
拦截“购物/零售”类别的所有用户流量
添加ssl策略pol_url_category -rule client.ssl.origin_server_cert.subject.URL_CATEGORIZE(0,0).CATEGORY.eq("Shopping/Retail") -action INTERCEPT
拦截到未分类URL的所有用户流量
添加ssl策略pol_url_category -rule client.ssl.origin_server_cert.subject.url_categorize(0,0).category.eq(" unclassified ") -action拦截
以下示例用于将域与URL集中的条目进行匹配的策略。
如果SNI中的域名与URL集“top100”中的条目匹配,则拦截所有用户流量。
添加ssl策略pol_url_set -rule client.ssl.client_hello.SNI.URLSET_MATCHES_ANY("top100") -action拦截
如果源服务器证书与URL集“top100”中的条目匹配,则拦截该域名的所有用户流量。
添加ssl策略pol_url_set -rule client.ssl.origin_server_cert.subject.URLSET_MATCHES_ANY("top100") -action拦截
通过使用GUI创建到代理服务器的SSL策略
- 导航到流量管理> SSL >策略.
- 在SSL政策选项卡上,单击添加并指定以下参数:
- 政策的名字
- 策略动作-从拦截、绕过或重置中选择。
- 表达式
- 点击创建.
该任务指导管理员通过CLI命令行绑定SSL策略到代理服务器
在命令提示符下,输入:
bind ssl vserver -policyName -priority -type INTERCEPT_REQ
例子:
bind ssl vserver -policyName pol1 -priority 10 -type INTERCEPT_REQ
使用GUI将SSL策略绑定到代理服务器
- 导航到“安全> SSL正向代理>代理虚拟服务器”.
- 选择虚拟服务器,单击编辑.
- 在高级设置,点击SSL政策.
- 点击SSL政策盒子。
- 在选择政策,选择需要绑定的策略。
- 在类型中,选择INTERCEPT_REQ.
- 点击绑定然后点击好吧.
该任务指导管理员通过CLI命令行解除SSL策略与代理服务器的绑定
在命令提示符下,输入:
unbind ssl vserver -policyName -type INTERCEPT_REQ
SSL策略中使用的SSL表达式
表达式 | 描述 |
---|---|
CLIENT.SSL.CLIENT_HELLO.SNI。* |
以字符串格式返回SNI扩展。求值字符串以查看它是否包含指定的文本。例如:client.ssl.client_hello.sni.contains (“xyz.com” ) |
CLIENT.SSL.ORIGIN_SERVER_CERT。* |
以字符串格式返回从后端服务器接收到的证书。求值字符串以查看它是否包含指定的文本。例如:client.ssl.origin_server_cert.subject.contains (“xyz.com” ) |
CLIENT.SSL.DETECTED_DOMAIN。* |
以字符串格式返回来自SNI扩展或原始服务器证书的域。求值字符串以查看它是否包含指定的文本。例如:client.ssl.detected_domain.contains (“xyz.com” ) |
SSL错误自动学习
如果开启了学习模式,设备将向SSL旁路列表添加一个域。学习模式基于从客户机或源服务器接收到的SSL警报消息。也就是说,学习依赖于客户机或服务器发送警报消息。如果没有发送警报消息,则没有学习。设备将学习是否满足以下任何条件:
从服务器接收客户端证书请求。
以下任何一个警报作为握手的一部分被接收:
- BAD_CERTIFICATE
- UNSUPPORTED_CERTIFICATE
- CERTIFICATE_REVOKED
- CERTIFICATE_EXPIRED
- CERTIFICATE_UNKNOWN
- UNKNOWN_CA(如果客户端使用固定,如果它收到服务器证书,它将发送此警报消息。)
- HANDSHAKE_FAILURE
要启用学习功能,必须启用错误缓存功能,并指定用于学习的内存。
通过使用GUI实现学习
导航到流量管理> SSL.
在设置,点击更改高级SSL设置.
在SSL拦截中,选择SSL拦截错误缓存.
在SSL拦截最大错误缓存内存,指定要保留的内存(以字节为单位)。
点击好吧.
通过CLI开启学习功能
在命令提示符中输入:
设置ssl参数-ssliErrorCache (ENABLED | DISABLED) -ssliMaxErrorCacheMem
参数:
ssliErrorCache:
启用或禁用动态学习,并缓存学习到的信息,以便做出拦截或绕过请求的后续决定。启用后,设备执行缓存查找以决定是否绕过请求。
取值范围:ENABLED、DISABLED
默认值:DISABLED
ssliMaxErrorCacheMem:
指定可用于缓存学习数据的最大内存(以字节为单位)。该内存用作LRU缓存,以便在设置的内存限制耗尽后用新条目替换旧条目。值为0自动决定极限。
默认值:0
最小值:0
最大值:4294967294
SSL配置文件
SSL配置文件是SSL设置的集合,例如密码和协议。如果您对不同的服务器有共同的设置,那么配置文件是有用的。不需要为每个服务器指定相同的设置,您可以创建一个概要文件,在概要文件中指定设置,然后将该概要文件绑定到不同的服务器。如果未创建自定义前端SSL配置文件,则将默认前端配置文件绑定到客户端实体。此配置文件使您能够配置管理客户端连接的设置。
对于SSL拦截,必须创建SSL配置文件,并在配置文件中启用SSL拦截。默认密码组绑定到此配置文件,但您可以配置更多密码以适应您的部署。将SSL拦截CA证书绑定到此配置文件,然后将该配置文件绑定到代理服务器。对于SSL拦截,配置文件中的基本参数是用于以下操作的参数:
- 检查源服务器证书的OCSP状态。
- 如果源服务器请求重新协商,触发客户端重新协商。
- 在重用前端SSL会话之前,请验证源服务器证书。
在与原始服务器通信时使用默认的后端配置文件。在默认后端配置文件中设置任何服务器端参数,例如密码套件。不支持自定义后端配置文件。
有关最常用的SSL设置的示例,请参阅本节末尾的“样例配置文件”。
内部网络和外部网络对密码/协议的支持不同。在下面的表中,用户和ADC设备之间的连接是内部网络。外部网络位于设备和internet之间。
表1:内部网络的密码/协议支持矩阵
参见表1对虚拟服务器/前端服务/内部服务的支持在Citrix ADC设备上可用的密码.
表2:外部网络的密码/协议支持矩阵
中对后端服务的支持参见表2在Citrix ADC设备上可用的密码.
通过命令行方式添加SSL配置文件并开启SSL拦截功能
在命令提示符下,输入:
add ssl profile
参数:
sslInterception:
启用或禁用SSL会话拦截。
取值范围:ENABLED、DISABLED
默认值:DISABLED
ssliReneg:
当从原始服务器接收到重新协商请求时,启用或禁用触发客户端重新协商。
取值范围:ENABLED、DISABLED
默认值:ENABLED
ssliOCSPCheck:
启用或禁用对源服务器证书进行OCSP检查。
取值范围:ENABLED、DISABLED
默认值:ENABLED
ssliMaxSessPerServer:
每个动态源服务器要缓存的最大SSL会话数。为在客户端hello消息中从客户端接收到的每个SNI扩展创建唯一的SSL会话。匹配的会话用于服务器会话重用。
默认值:10
最小值:1
最大值:1000
例子:
add ssl profile swg_ssl_profile -sslinterception ENABLED Done sh ssl profile swg_ssl_profile 1)名称:swg_ssl_profile(前端)SSLv3: DISABLED TLSv1.0: ENABLED TLSv1.1: ENABLED TLSv1.2: ENABLED客户端认证:DISABLED仅使用绑定CA证书:DISABLED严格CA检查:无会话重用:启用超时:120秒DH: DISABLED DH私钥指数大小限制:DISABLED Ephemeral RSA: ENABLED刷新计数:0拒绝ssl重协商所有非FIPS密码:DISABLED密码重定向:禁用SSL重定向:禁用发送关闭通知:是严格签名摘要检查:禁用Push加密触发:始终Push加密触发超时:1毫秒SNI:禁用OCSP订书:禁用严格主机头检查SNI启用SSL会话:NO推送标志:0x0(自动)SSL量子大小:8 kB加密触发超时100 ms加密触发包计数:45主题/颁发者名称插入格式:Unicode SSL拦截:启用SSL拦截OCSP检查:启用SSL拦截端到端重新协商:启用SSL拦截服务器证书验证客户端重用:启用SSL拦截每台服务器最大重用会话:10会话票据:禁用会话票据生存期:300(秒)HSTS:禁用HSTS inclesubdomains: NO HSTS Max-Age: 0 ECC曲线:P_256, P_384, P_224, P_521 1)密码名称:DEFAULT优先级:1描述:预定义密码别名完成
该任务指导管理员通过命令行绑定SSL拦截CA证书到SSL配置文件
在命令提示符下,输入:
绑定ssl配置文件
例子:
bind ssl profile swg_ssl_profile -ssliCACertkey swg_ca_cert Done sh ssl profile swg_ssl_profile 1)名称:swg_ssl_profile(前端)SSLv3: DISABLED TLSv1.0: ENABLED TLSv1.1: ENABLED TLSv1.2: ENABLED客户端认证:DISABLED仅使用绑定CA证书:DISABLED严格CA检查:无会话重用:ENABLED超时:120秒DH: DISABLED DH私钥指数大小限制:DISABLED Ephemeral RSA: ENABLED刷新计数:0拒绝ssl重协商所有非FIPS密码:DISABLED密码重定向:禁用SSL重定向:禁用发送关闭通知:是严格签名摘要检查:禁用Push加密触发:始终Push加密触发超时:1毫秒SNI:禁用OCSP订书:禁用严格主机头检查SNI启用SSL会话:NO推送标志:0x0(自动)SSL量子大小:8 kB加密触发超时100 ms加密触发包计数:45主题/颁发者名称插入格式:Unicode SSL拦截:启用SSL拦截OCSP检查:启用SSL拦截端到端重新协商:启用SSL拦截服务器证书验证客户端重用:启用SSL拦截每台服务器最大重用会话:10会话票据:禁用会话票据生存期:300(秒)HSTS:禁用HSTS inclesubdomains: NO HSTS Max-Age: 0 ECC曲线:P_256, P_384, P_224, P_521 1)密码名称:DEFAULT优先级:1描述:预定义密码别名1)SSL拦截CA CertKey名称:swg_ca_cert Done
使用GUI将SSL拦截CA证书绑定到SSL配置文件
导航到系统>配置文件>SSL配置文件.
点击添加.
为概要文件指定一个名称。
启用SSL会话拦截.
点击好吧.
在高级设置,点击证书的关键.
指定要绑定到配置文件的SSL拦截CA证书密钥。
点击选择然后点击绑定.
可选地,配置密码以适应您的部署。
- 单击编辑图标,然后单击添加.
- 选择一个或多个密码组,单击右箭头。
- 点击好吧.
点击完成.
通过使用GUI将SSL配置文件绑定到代理服务器
- 导航到安全>SSL正向代理>代理虚拟服务器,添加服务器或选择需要修改的服务器。
- 在SSL配置文件,单击编辑图标。
- 在SSL配置文件列表中,选择前面创建的SSL配置文件。
- 点击好吧.
- 点击完成.
样例配置文件:
名称:swg_ssl_profile(前端)SSLv3: DISABLED TLSv1.0: ENABLED TLSv1.1: ENABLED TLSv1.2: ENABLED客户端认证:DISABLED仅使用绑定CA证书:DISABLED严格CA检查:无会话重用:启用超时:120秒DH: DISABLED DH私钥指数大小限制:禁用临时RSA: ENABLED刷新计数:0拒绝SSL重新协商所有非FIPS密码:禁用密码重定向:禁用SSL重定向:禁用发送关闭通知:YES严格签名摘要检查:DISABLED Push Encryption Trigger: Always Push Encryption Trigger timeout: 1ms SNI: DISABLED OCSP Stapling: DISABLED SNI使能SSL会话严格主机头检查:NO Push flag: 0x0 (Auto) SSL量子大小:8kb加密触发超时100ms加密触发包计数:45主题/颁发者名称插入格式:Unicode SSL拦截:enabled SSL拦截OCSP检查:enabled SSL拦截端到端重新协商:启用SSL拦截每台服务器最大复用会话数:10会话票据:禁用会话票据生存期:300(秒)HSTS:禁用HSTS inclesubdomains: NO HSTS Max-Age: 0 ECC曲线:P_256, P_384, P_224, P_521 1)密码名称:DEFAULT优先级:1描述:预定义密码别名1)SSL拦截CA CertKey名称:swg_ca_cert