ADC

SSL 内置操作和用户定义的操作

除非您只需要策略中的内置操作,否则您必须在创建策略之前创建操作。然后,您可以在创建策略时指定操作。内置操作有两种类型:控制操作和数据操作。您可以在控制策略中使用控制操作,在数据策略中使用数据操作。

内置的控制操作是:

  • 多客户端-执行客户端证书身份验证。(TLS1.3 不支持)
  • NOCLIENTAUTH — 不执行客户端证书身份验证。(TLS1.3 不支持)

内置的数据操作是:

  • 重置-通过向客户端发送 RST 数据包来关闭连接。
  • drop-从客户端删除所有数据包。连接保持打开状态,直到客户端关闭它。
  • NOOP-转发数据包而不对其执行任何操作。

注意: TLS 1.3 协议不支持客户端身份验证的任何相关操作,例如 ClientCertRiscoity 和 sslLogProfile。

您可以创建用户定义的数据操作。如果启用客户端身份验证,则可以创建 SSL 操作,以便在将请求转发到 Web 服务器之前将客户端证书数据插入到请求标头。

如果策略评估导致未定义状态,则执行 UNDEF 操作。对于数据策略或控制策略,您可以将 RESET、DROP 或 NOOP 指定为 UNDEF 操作。对于控制策略,您还可以选择指定 DOCLIENTAUTH 或 NOCLIENTAUTH。

策略中的内置操作示例

在以下示例中,如果客户端发送的密码不是 EXPORT 类别密码,Citrix ADC 设备将请求客户端身份验证。客户端必须为成功的交易提供有效证书。

add ssl policy pol1 -rule CLIENT.SSL.CIPHER_EXPORTABLE.NOT -reqAction DOCLIENTAUTH
<!--NeedCopy-->

以下示例假定已启用客户端身份验证。

如果用户提供的证书中的版本与策略中的版本匹配,则不会执行任何操作并转发数据包:

add ssl policy pol1 -rule CLIENT.SSL.CLIENT_CERT.VERSION.EQ(2) -reqAction NOOP
<!--NeedCopy-->

如果用户提供的证书中的版本与策略中的版本匹配,则连接将被删除:

add ssl policy pol1 -rule CLIENT.SSL.CLIENT_CERT.VERSION.EQ(2) -reqAction DROP
<!--NeedCopy-->

如果用户提供的证书中的版本与策略中的版本匹配,则重置连接:

add ssl policy pol1 -rule CLIENT.SSL.CLIENT_CERT.VERSION.EQ(2) -reqAction RESET
<!--NeedCopy-->

基于策略的客户端身份验证客户端证书验证

配置基于策略的客户端身份验证时,可以将客户端证书验证设置为强制或选项。默认值是强制性的。

使用 CLI 将客户端证书验证设置为可选的

在命令提示符下,键入:

add ssl action <name> ((-clientAuth ( DOCLIENTAUTH | NOCLIENTAUTH ) [-clientCertVerification ( Mandatory | Optional )]
<!--NeedCopy-->

示例:

add ssl action sslact -clientauth DOCLIENTAUTH -clientcertverification OPTIONAL
<!--NeedCopy-->

使用 GUI 将客户端证书验证设置为可选的

  1. 导航到 Traffic Management(流量管理)> SSL > Policies(策略)

  2. SSL 操作 选项卡上,单击 添加

  3. 指定名称,然后在“客户端证书验证”列表中选择“可选”。

用户定义的 SSL 操作

除了内置操作之外,您还可以根据部署配置其他 SSL 操作。这些操作称为用户定义的操作。

使用 CLI 配置用户定义的 SSL 操作

在命令提示符下,键入以下命令以配置操作并验证配置:

add SSL action <name> -clientAuth(DOCLIENTAUTH | NOCLIENTAUTH) -clientCert (ENABLED | DISABLED) certHeader <string> -clientHeader <string> -clientCertSerialNumber (ENABLED | DISABLED) -certSerialHeader <string> -clientCertSubject (ENABLED | DISABLED) -certSubjectHeader <string> -clientCertHash (ENABLED | DISABLED) -certHashHeader <string> -clientCertIssuer (ENABLED | DISABLED) -certIssuerHeader <string> -sessionID (ENABLED | DISABLED) -sessionIDheader <string> -cipher (ENABLED | DISABLED) -cipherHeader <string> -clientCertNotBefore (ENABLED | DISABLED) -certNotBeforeHeader <string> -clientCertNotAfter (ENABLED | DISABLED) -certNotAfterHeader <string> -OWASupport (ENABLED | DISABLED)
<!--NeedCopy-->
show ssl action [<name>]
<!--NeedCopy-->

示例:

add ssl action Action-SSL-ClientCert -clientCert ENABLED -certHeader "X-Client-Cert"
<!--NeedCopy-->
show ssl action Action-SSL-ClientCert

1)      Name: Action-SSL-ClientCert
        Data Insertion Action:
        Cert Header: ENABLED            Cert Tag: X-Client-Cert
Done
<!--NeedCopy-->

使用 GUI 配置用户定义的 SSL 操作

导航到 流量管理 > SSL > 策略 ,然后在 作选项卡上单击 添加

配置 SSL 操作以将客户端流量转发到另一个虚拟服务器

管理员可以配置 SSL 操作,将 SSL 虚拟服务器上收到的客户端流量转发到另一个虚拟服务器,以避免 SSL 卸载。或用于终止 ADC 设备上的连接。此虚拟服务器可以是 SSL、TCP 或 SSL_BRIDGE。例如,如果出现以下任何情况,管理员可以选择将请求转发到另一个虚拟服务器进行进一步操作,而不是终止连接:

  • 设备没有证书。
  • 设备不支持特定的密码。

为了实现上述目标,添加了一个新的绑定点“CLIENTHELLO_REQ”,以便在收到客户端 hello 时评估客户端流量。如果在解析客户端 hello 后绑定到接收客户端流量的虚拟服务器的策略计算结果为 true,则流量将转发到另一个虚拟服务器。如果此虚拟服务器为 SSL 类型,则执行握手。如果此虚拟服务器类型为 TCP 或 SSL_Bridge,则后端服务器执行握手。

在 12.1-49.x 版中,只支持“CIENTHELLO_REQ”绑定点的转发和重置操作。以下表达式前缀可用:

  • CLIENT.SSL.CLIENT_HELLO.CIPHERS.HAS_HEXCODE
  • CLIENT.SSL.CLIENT_HELLO.CLIENT_VERSION
  • CLIENT.SSL.CLIENT_HELLO.IS_RENEGOTIATE
  • CLIENT.SSL.CLIENT_HELLO.IS_REUSE
  • CLIENT.SSL.CLIENT_HELLO.IS_SCSV
  • CLIENT.SSL.CLIENT_HELLO.IS_SESSION_TICKET
  • CLIENT.SSL.CLIENT_HELLO.LENGTH
  • CLIENT.SSL.CLIENT_HELLO.SNI
  • CLIENT.SSL.CLIENT_HELLO.ALPN.HAS_NEXTPROTOCOL(从版本 13.0 Build 61.x)

有关这些前缀的描述,请参阅 高级策略表达式:解析 SSL

将参数 forward 添加到 add SSL action 命令中,并将新绑定点 CLIENTHELLO_REQ 添加到 bind ssl vserver 命令中。

使用 CLI 进行配置

在命令提示符下,键入:

add ssl action <name> -forward <virtual server name>

add ssl policy <name> -rule <expression> -action <string>

bind ssl vserver <vServerName> -policyName <string> -priority <positive_integer> -type <type>
<!--NeedCopy-->

示例

add ssl action act1 -forward v2

add ssl policy pol1 -rule client.ssl.client_hello.ciphers.has_hexcode(0x002f) -action act1

bind ssl vserver v1 -policyName pol1 -priority 1 -type CLIENTHELLO_REQ
<!--NeedCopy-->

使用 GUI 进行配置

导航到 Traffic Management(流量管理)> SSL > Policies(策略)

创建 SSL 操作

  1. SSL 操作中,单击 添加
  2. 在“创建 SSL 操作”中,指定操作的名称。
  3. 在“转发操作虚拟服务器”中,选择现有虚拟服务器或添加新的虚拟服务器以将流量转发到。
  4. 或者,设置其他参数。
  5. 单击创建

创建 SSL 策略

  1. SSL 策略中,单击 添加
  2. 创建 SSL 策略中,指定策略的名称。
  3. 在“作”中,选择您之前创建的操作。
  4. 表达式编辑器中,输入要求计算的规则。
  5. 单击创建

创建或添加虚拟服务器和绑定策略

  1. 导航到 流量管理 > 负载平衡 > 虚拟服务器
  2. 添加或选择虚拟服务器。
  3. 高级设置中,单击 SSL 策略
  4. 单击 SSL 策略部分。
  5. 在“选择策略”中,选择您之前创建的策略。
  6. 策略绑定中,指定策略的优先级。
  7. 在“类型”中,选择“CLIENTHELLO_REQ”。
  8. 单击 Bind(绑定)。
  9. 单击完成

有关最常用的用例的端到端配置,请参阅以下主题:

基于 SNI 的 SSL 操作选择性选择 CA 进行客户端身份验证

您只能在客户端证书请求中发送基于 SNI(域)的 CA 列表,而不是绑定到 SSL 虚拟服务器的所有 CA 列表。例如,收到客户端 hello 时,仅发送基于 SSL 策略表达式(例如,SNI)的 CA 证书。要发送一组特定的证书,必须创建 CA 证书组。然后,将此组绑定到 SSL 操作,并将该操作绑定到 SSL 策略。如果在解析客户端 hello 后绑定到接收客户端流量的虚拟服务器的策略计算结果为 true,则仅在客户端请求证书中发送特定的 CA 证书组。

之前,您必须将 CA 证书绑定到 SSL 虚拟服务器。通过此增强功能,您可以简单地添加 CA 证书组并将其关联到 SSL 操作。

注意: 在 SSL 虚拟服务器上启用客户端身份验证和 SNI。将正确的 SNI 证书绑定到虚拟服务器。

执行以下步骤:

  1. 添加 CA 证书组。

  2. 添加证书密钥对。

  3. 将证书密钥对绑定到此组。

  4. 添加 SSL 操作。

  5. 添加 SSL 策略。在策略中指定操作。

  6. 将策略绑定到 SSL 虚拟服务器。将绑定点指定为 CLIENTHELLO_REQ。

使用 CLI 进行配置

在命令提示符下,按顺序键入以下命令:

add ssl caCertGroup <caCertGroupName>
add ssl certkey <certkey_name> -cert <cert> -key <key>
bind ssl caCertGroup <caCertGroupName> <certkey_name>
add ssl action <name> -caCertGrpName <string>
add ssl policy <name> -rule <expression> -action <string>
bind ssl vserver <vServerName> -policyName <string> -priority <positive_integer> -type CLIENTHELLO_REQ
<!--NeedCopy-->

示例:

add ssl cacertGroup ca_cert_group

add ssl certkey ca_certkey1 -cert cacert1 -key cakey1
add ssl certkey ca_certkey2 -cert cacert2 -key cakey2
add ssl certkey snicert -cert snicert -key snikey

bind ssl cacertGroup ca_cert_group ca_certkey1
bind ssl caCertGroup ca_cert_group ca_certkey2
<!--NeedCopy-->
sh ssl caCertGroup ca_cert_group

CA GROUP NAME:     ca_cert_group
ACTIONS REFERRING: 1

1) CertKey Name: ca_certkey1   CA Certificate   CRLCheck: Optional   CA_Name Sent
2) CertKey Name: ca_certkey2   CA Certificate   CRLCheck: Optional   CA_Name Sent
<!--NeedCopy-->
add ssl action pick_ca_group -cacertGrpName ca_cert_group
<!--NeedCopy-->
sh ssl action pick_ca_group
1) Name: pick_ca_group
   Type: Data Insertion
   PickCaCertGroup: ca_cert_group
   Hits: 0
   Undef Hits: 0
   Action Reference Count: 1
<!--NeedCopy-->
add ssl policy snipolicy -rule client.ssl.client_hello.sni.contains("abc") -action pick_ca_group
bind ssl vserver v_SSL -policyName snipolicy -type CLIENTHELLO_REQ -priority 10
<!--NeedCopy-->
sh ssl policy snipolicy
    Name: snipolicy
    Rule: client.ssl.client_hello.sni.contains("abc")
    Action: pick_ca_group
    UndefAction: Use Global
    Hits: 0
    Undef Hits: 0


    Policy is bound to following entities
1)  Bound to: CLIENTHELLO_REQ VSERVER v_SSL
    Priority: 10
<!--NeedCopy-->
set ssl vserver v_SSL -clientauth ENABLED -SNIEnable ENABLED
bind ssl vserver v_SSL -certkeyName snicert -sniCert
<!--NeedCopy-->
sh ssl vserver v_SSL

    Advanced SSL configuration for VServer v_SSL:
    DH: DISABLED
    DH Private-Key Exponent Size Limit: DISABLED   Ephemeral RSA: ENABLED   Refresh Count: 0
    Session Reuse: ENABLED   Timeout: 120 seconds
    Cipher Redirect: DISABLED
    SSLv2 Redirect: DISABLED
    ClearText Port: 0
    Client Auth: ENABLED   Client Cert Required: Mandatory
    SSL Redirect: DISABLED
    Non FIPS Ciphers: DISABLED
    SNI: ENABLED
    OCSP Stapling: DISABLED
    HSTS: DISABLED
    HSTS IncludeSubDomains: NO
    HSTS Max-Age: 0
    SSLv2: DISABLED  SSLv3: ENABLED  TLSv1.0: ENABLED  TLSv1.1: ENABLED  TLSv1.2: ENABLED  TLSv1.3: DISABLED
    Push Encryption Trigger: Always
    Send Close-Notify: YES
    Strict Sig-Digest Check: DISABLED
    Zero RTT Early Data: DISABLED
    DHE Key Exchange With PSK: NO
    Tickets Per Authentication Context: 1

    ECC Curve: P_256, P_384, P_224, P_521

1)  CertKey Name: snicert   Server Certificate for SNI


    Data policy
1)  Policy Name: snipolicy  Priority: 10



1)  Cipher Name: DEFAULT
    Description: Default cipher list with encryption strength >= 128bit
<!--NeedCopy-->

使用 GUI 进行配置

创建 CA 证书组并将证书绑定到组

  1. 导航到 流量管理 > SSL > CA 证书组
  2. 单击“添加”并为组指定名称。
  3. 单击创建
  4. 选择 CA 证书组 ,然后单击 显示绑定
  5. 单击 Bind(绑定)。
  6. 在“CA 证书绑定”页面中,选择现有证书或单击“添加”以添加新证书。
  7. 单击 选择 ,然后单击 绑定
  8. 若要绑定另一个证书,请重复步骤 5 到 7。
  9. 单击关闭

导航到 Traffic Management(流量管理)> SSL > Policies(策略)

创建 SSL 操作

  1. SSL 操作中,单击 添加
  2. 在“创建 SSL 操作”中,指定操作的名称。
  3. 在“转发操作虚拟服务器”中,选择现有虚拟服务器或添加要将流量转发到的虚拟服务器。
  4. 或者,设置其他参数。
  5. 单击创建

创建 SSL 策略

  1. SSL 策略中,单击 添加
  2. 创建 SSL 策略中,指定策略的名称。
  3. 在“作”中,选择之前创建的操作。
  4. 表达式编辑器中,输入要求计算的规则。
  5. 单击创建

创建或添加虚拟服务器和绑定策略

  1. 导航到 流量管理 > 负载平衡 > 虚拟服务器
  2. 添加或选择虚拟服务器。
  3. 高级设置中,单击 SSL 策略
  4. 单击 SSL 策略部分。
  5. 在“选择策略”中,选择您之前创建的策略。
  6. 策略绑定中,指定策略的优先级。
  7. 在“类型”中,选择“CLIENTHELLO_REQ”。
  8. 单击 Bind(绑定)。
  9. 单击完成

使用 GUI 解除绑定 CA 证书组

  1. 导航到 流量管理 > SSL > CA 证书组
  2. 选择一个证书组,然后单击 显示绑定
  3. 选择要从组中删除的证书,然后单击“取 消绑定”。
  4. 如果提示进行确认,请单击“**是” • • 。
  5. 单击关闭

使用 GUI 删除 CA 证书组

  1. 导航到 流量管理 > SSL > CA 证书组
  2. 选择一个证书组,然后单击“删除”。
  3. 如果提示进行确认,请单击