ADC

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

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

内置的控制操作是:

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

内置的数据操作是:

  • 重置—通过向客户端发送 RST 数据包来关闭连接。
  • 丢弃—丢弃来自客户端的所有数据包。在客户端关闭连接之前,连接将保持打开状态。
  • NOOP - 转发数据包而不对其执行任何操作。

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

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

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

策略中内置操作的示例

在以下示例中,如果客户端发送的密码不是 EXPORT 类别的密码,则 NetScaler 设备会请求客户端身份验证。客户必须提供有效的证书才能成功进行交易。

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 中,CLIENTHELLO_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. Forward Action Virtual Server 中,选择现有的虚拟服务器或添加一个新的虚拟服务器来将流量转发到。
  4. (可选)设置其他参数。
  5. 单击创建

创建 SSL 策略

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

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

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

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

基于 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. 单击绑定
  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. 单击绑定
  9. 单击 Done(完成)。

使用 GUI 解除绑定 CA 证书组

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

使用 GUI 删除 CA 证书组

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