Provided by: trafficserver_9.2.0+ds-2_amd64 bug

NAME

       sni.yaml - Traffic Server sni rules configuration file

DESCRIPTION

       This  file  is  used  to configure aspects of TLS connection handling for both inbound and
       outbound connections. With the exception of host_sni_policy (see the  description  below),
       the configuration is driven by the SNI values provided by the inbound connection. The file
       consists of a set of configuration items, each identified by an SNI value (fqdn).  When an
       inbound  TLS connection is made, the SNI value from the TLS negotiation is matched against
       the items specified by this file and if there is a match, the  values  specified  in  that
       item  override  the  defaults. This is done during the inbound connection processing; some
       outbound properties can be overridden again later, such as via remap.config or plugins.

       By  default  this  is  named  sni.yaml.  The  filename   can   be   changed   by   setting
       proxy.config.ssl.servername.filename.  This  file is loaded on start up and by traffic_ctl
       config reload if the file has been modified since process start.

       The configuration file is YAML-based. After parsing the configuration, a  list  of  tables
       will  be the result.  Each table is a set of key / value pairs that create a configuration
       item. This configuration file accepts wildcard entries. To apply an SNI based  setting  on
       all  the  server  names with a common upper level domain name, the user needs to enter the
       fqdn in the configuration with a *. followed by the common domain name.  (*.yahoo.com  for
       example).

       For  some  settings, there is no guarantee that they will be applied to a connection under
       certain conditions.  An established TLS connection may be reused for another  server  name
       if  it’s  used  for  HTTP/2.  This  also means that settings for server name A may affects
       requests        for        server        name        B        as         well.         See
       https://daniel.haxx.se/blog/2016/08/18/http2-connection-coalescing/  for  a  more detailed
       description of HTTP/2 connection coalescing.

       ┌─────────────────────────┬───────────┬───────────────────────────────────────────────────┐
       │Key                      │ Direction │ Meaning                                           │
       ├─────────────────────────┼───────────┼───────────────────────────────────────────────────┤
       │fqdn                     │ Both      │ Fully  Qualified  Domain                          │
       │                         │           │ Name.  This item is used                          │
       │                         │           │ if the SNI value matches                          │
       │                         │           │ this.                                             │
       ├─────────────────────────┼───────────┼───────────────────────────────────────────────────┤
       │ip_allow                 │ Inbound   │ Specify a list of client                          │
       │                         │           │ IP address, subnets,  or                          │
       │                         │           │ ranges  what are allowed                          │
       │                         │           │ to     complete      the                          │
       │                         │           │ connection. This list is                          │
       │                         │           │ comma  separated.   IPv4                          │
       │                         │           │ and  IPv6  addresses can                          │
       │                         │           │ be specified.   Here  is                          │
       │                         │           │ an     example     list:                          │
       │                         │           │ 192.168.1.0/24,192.168.10.1-4.                    │
       │                         │           │ This     would     allow                          │
       │                         │           │ connections from clients                          │
       │                         │           │ in     the    19.168.1.0                          │
       │                         │           │ network or in the  range                          │
       │                         │           │ from   192.168.10.1   to                          │
       │                         │           │ 192.168.1.4.                                      │
       └─────────────────────────┴───────────┴───────────────────────────────────────────────────┘

       │verify_server_policy     │ Outbound  │ One of  the  values  DISABLED,                    │
       │                         │           │ PERMISSIVE, or ENFORCED.                          │
       │                         │           │                                                   │
       │                         │           │ By     default     this     is                    │
       │                         │           │ proxy.config.ssl.client.verify.server.policy.     │
       │                         │           │ This   controls   how  Traffic                    │
       │                         │           │ Server  evaluated  the  origin                    │
       │                         │           │ certificate.                                      │
       ├─────────────────────────┼───────────┼───────────────────────────────────────────────────┤
       │verify_server_properties │ Outbound  │ One  of the values NONE, SIGNATURE, NAME, and     │
       │                         │           │ ALL                                               │
       │                         │           │                                                   │
       │                         │           │ By          default          this          is     │
       │                         │           │ proxy.config.ssl.client.verify.server.properties. │
       │                         │           │ This controls what Traffic Server checks when     │
       │                         │           │ evaluating the origin certificate.                │
       ├─────────────────────────┼───────────┼───────────────────────────────────────────────────┤
       │verify_client            │ Outbound  │ One  of the values NONE, MODERATE, or STRICT.  If │
       │                         │           │ NONE is specified,  Traffic  Server  requests  no │
       │                         │           │ certificate.   If  MODERATE  is specified Traffic │
       │                         │           │ Server  will  verify  a   certificate   that   is │
       │                         │           │ presented by the client, but it will not fail the │
       │                         │           │ TLS handshake if no certificate is presented.  If │
       │                         │           │ STRICT  is  specified  the  client must present a │
       │                         │           │ certificate during the TLS handshake.             │
       │                         │           │                                                   │
       │                         │           │ By           default           this            is │
       │                         │           │ proxy.config.ssl.client.certification_level.      │
       ├─────────────────────────┼───────────┼───────────────────────────────────────────────────┤
       │verify_client_ca_certs   │ Both      │ Specifies   an   alternate   set  of  certificate │
       │                         │           │ authority certs to use to verify the client cert. │
       │                         │           │ The value must be either a file path, or a nested │
       │                         │           │ set of key / value pairs.  If the value is a file │
       │                         │           │ path,  it  must  specify a file containing the CA │
       │                         │           │ certs.  Otherwise, there  should  be  up  to  two │
       │                         │           │ nested  pairs.   The  possible  keys are file and │
       │                         │           │ dir.  The value for file must be a file path  for │
       │                         │           │ a  file  containing  CA certs.  The value for dir │
       │                         │           │ must be a file path for an  OpenSSL  X509  hashed │
       │                         │           │ directory  containing  CA certs.  If a given file │
       │                         │           │ path does not being with / , it must be  relative │
       │                         │           │ to  the  Traffic  Server configuration directory. │
       │                         │           │ verify_client_ca_certs  can  only  be  used  with │
       │                         │           │ capbilities provided by OpenSSL 1.0.2 or later.   │
       └─────────────────────────┴───────────┴───────────────────────────────────────────────────┘

       │host_sni_policy          │ Inbound   │ One   of  the  values  DISABLED,  PERMISSIVE,  or │
       │                         │           │ ENFORCED.                                         │
       │                         │           │                                                   │
       │                         │           │ If    not     specified,     the     value     of │
       │                         │           │ proxy.config.http.host_sni_policy  is used.  This │
       │                         │           │ controls how policy impacting mismatches  between │
       │                         │           │ host  header  and SNI values are dealt with.  For │
       │                         │           │ details about hos this configuration behaves, see │
       │                         │           │ the                                 corresponding │
       │                         │           │ proxy.config.http.host_sni_policy  records.config │
       │                         │           │ documentation.                                    │
       │                         │           │                                                   │
       │                         │           │ Note  that  this particular configuration will be │
       │                         │           │ inspected at the time the HTTP Host header  field │
       │                         │           │ is  processed. Further, this policy check will be │
       │                         │           │ keyed off of the Host header field  value  rather │
       │                         │           │ than  the SNI in this sni.yaml file. This is done │
       │                         │           │ because the Host header field is  ultimately  the │
       │                         │           │ resource  that  will be retrieved from the origin │
       │                         │           │ and the administrator will intend to  guard  this │
       │                         │           │ resource  rather  than the SNI, which a malicious │
       │                         │           │ user may alter to some other server  value  whose │
       │                         │           │ policies  are  more  lenient  than the host he is │
       │                         │           │ trying to access.                                 │
       ├─────────────────────────┼───────────┼───────────────────────────────────────────────────┤
       │valid_tls_versions_in    │ Inbound   │ This specifies the list  of  TLS  protocols  that │
       │                         │           │ will  be  offered  to  user agents during the TLS │
       │                         │           │ negotiation.  This replaces the  global  settings │
       │                         │           │ in                        proxy.config.ssl.TLSv1, │
       │                         │           │ proxy.config.ssl.TLSv1_1,                         │
       │                         │           │ proxy.config.ssl.TLSv1_2,                     and │
       │                         │           │ proxy.config.ssl.TLSv1_3.  The  potential  values │
       │                         │           │ are  TLSv1,  TLSv1_1,  TLSv1_2, and TLSv1_3.  You │
       │                         │           │ must  list  all  protocols  that  Traffic  Server │
       │                         │           │ should  offer  to the client when using this key. │
       │                         │           │ This key is only  valid  for  OpenSSL  1.1.0  and │
       │                         │           │ later and BoringSSL. Older versions of OpenSSL do │
       │                         │           │ not provide a hook early enough to update the SSL │
       │                         │           │ object.   It is a syntax error for Traffic Server │
       │                         │           │ built against earlier versions.                   │
       ├─────────────────────────┼───────────┼───────────────────────────────────────────────────┤
       │client_cert              │ Outbound  │ The file containing the client certificate to use │
       │                         │           │ for the outbound connection.                      │
       │                         │           │                                                   │
       │                         │           │ If  this  is relative, it is relative to the path │
       │                         │           │ in proxy.config.ssl.client.cert.path. If not  set │
       │                         │           │ proxy.config.ssl.client.cert.filename is used.    │
       ├─────────────────────────┼───────────┼───────────────────────────────────────────────────┤
       │client_key               │ Outbound  │ The  file  containing the client private key that │
       │                         │           │ corresponds to the certificate for  the  outbound │
       │                         │           │ connection.                                       │
       │                         │           │                                                   │
       │                         │           │ If  this  is relative, it is relative to the path │
       │                         │           │ in  proxy.config.ssl.client.private_key.path.  If │
       │                         │           │ not  set,  Traffic  Server tries to use a private │
       │                         │           │ key       in       client_cert.        Otherwise, │
       │                         │           │ proxy.config.ssl.client.private_key.filename   is │
       │                         │           │ used.                                             │
       ├─────────────────────────┼───────────┼───────────────────────────────────────────────────┤
       │client_sni_policy        │ Outbound  │ Policy of SNI on outbound connection.             │
       │                         │           │                                                   │
       │                         │           │ If    not     specified,     the     value     of │
       │                         │           │ proxy.config.ssl.client.sni_policy is used.       │
       └─────────────────────────┴───────────┴───────────────────────────────────────────────────┘

       │http2                    │ Inbound   │ Indicates whether the H2 protocol should be added │
       │                         │           │ to or removed from the protocol negotiation list. │
       │                         │           │ The valid values are on or off.                   │
       ├─────────────────────────┼───────────┼───────────────────────────────────────────────────┤
       │http2_buffer_water_mark  │ Inbound   │ Specifies  the  high  water  mark  for all HTTP/2 │
       │                         │           │ frames on an  outoging  connection.   By  default │
       │                         │           │ this                                           is │
       │                         │           │ proxy.config.http2.default_buffer_water_mark.     │
       │                         │           │ NOTE:  Connection  coalescing  may  prevent  this │
       │                         │           │ taking effect.                                    │
       ├─────────────────────────┼───────────┼───────────────────────────────────────────────────┤
       │disable_h2               │ Inbound   │ Deprecated  for  the  more  general  h2  setting. │
       │                         │           │ Setting disable_h2 to true is the same as setting │
       │                         │           │ http2 to on.                                      │
       ├─────────────────────────┼───────────┼───────────────────────────────────────────────────┤
       │tunnel_route             │ Inbound   │ Destination as an FQDN and port, separated  by  a │
       │                         │           │ colon  :.  Match group number can be specified by │
       │                         │           │ $N where N should refer to a specified  group  in │
       │                         │           │ the FQDN, tunnel_route: $1.domain.                │
       │                         │           │                                                   │
       │                         │           │ This  will  forward  all traffic to the specified │
       │                         │           │ destination   without   first   terminating   the │
       │                         │           │ incoming TLS connection.                          │
       ├─────────────────────────┼───────────┼───────────────────────────────────────────────────┤
       │forward_route            │ Inbound   │ Destination  as  an FQDN and port, separated by a │
       │                         │           │ colon :.                                          │
       │                         │           │                                                   │
       │                         │           │ This  is  similar   to   tunnel_route,   but   it │
       │                         │           │ terminates  the  TLS  connection and forwards the │
       │                         │           │ decrypted  traffic.  Traffic  Server   will   not │
       │                         │           │ interpret  the decrypted data, so the contents do │
       │                         │           │ not need to be HTTP.                              │
       ├─────────────────────────┼───────────┼───────────────────────────────────────────────────┤
       │partial_blind_route      │ Inbound   │ Destination as an FQDN and port, separated  by  a │
       │                         │           │ colon :.                                          │
       │                         │           │                                                   │
       │                         │           │ This  is similar to forward_route in that Traffic │
       │                         │           │ Server terminates the  incoming  TLS  connection. │
       │                         │           │ In addition partial_blind_route creates a new TLS │
       │                         │           │ connection to the specified origin.  It does  not │
       │                         │           │ interpret the decrypted data before passing it to │
       │                         │           │ the origin TLS connection, so the contents do not │
       │                         │           │ need to be HTTP.                                  │
       ├─────────────────────────┼───────────┼───────────────────────────────────────────────────┤
       │tunnel_alpn              │ Inbound   │ List  of  ALPN  Protocol  Ids  for  Partial Blind │
       │                         │           │ Tunnel.                                           │
       │                         │           │                                                   │
       │                         │           │ ATS  negotiates  application  protocol  with  the │
       │                         │           │ client on behalf of the origin server.  This only │
       │                         │           │ works with partial_blind_route.                   │
       └─────────────────────────┴───────────┴───────────────────────────────────────────────────┘

   Pre-warming TLS Tunnel
                  ┌────────────────────────────────┬──────────────────────────────────┐
                  │Key                             │ Meaning                          │
                  ├────────────────────────────────┼──────────────────────────────────┤
                  │tunnel_prewarm                  │ Override                         │
                  │                                │ proxy.config.tunnel.prewarm   in │
                  │                                │ records.config.                  │
                  ├────────────────────────────────┼──────────────────────────────────┤
                  │tunnel_prewarm_srv              │ Enable  SRV  record  lookup   on │
                  │                                │ pre-warming. Default is false.   │
                  └────────────────────────────────┴──────────────────────────────────┘

                  │tunnel_prewarm_rate             │ Rate  of how many connections to │
                  │                                │ pre-warm. Default is 1.0.        │
                  ├────────────────────────────────┼──────────────────────────────────┤
                  │tunnel_prewarm_min              │ Minimum  number  of  pre-warming │
                  │                                │ queue size (per thread). Default │
                  │                                │ is 0.                            │
                  ├────────────────────────────────┼──────────────────────────────────┤
                  │tunnel_prewarm_max              │ Maximum  number  of  pre-warming │
                  │                                │ queue size (per thread). Default │
                  │                                │ is -1 (unlimited).               │
                  ├────────────────────────────────┼──────────────────────────────────┤
                  │tunnel_prewarm_connect_timeout  │ Timeout  for  TCP/TLS  handshake │
                  │                                │ (in seconds).                    │
                  ├────────────────────────────────┼──────────────────────────────────┤
                  │tunnel_prewarm_inactive_timeout │ Inactive timeout for connections │
                  │                                │ in the pool (in seconds).        │
                  └────────────────────────────────┴──────────────────────────────────┘

       Client     verification,     via      verify_client,      corresponds      to      setting
       proxy.config.ssl.client.certification_level for this connection as noted below.

       NONE -- 0
              Do not request a client certificate, ignore it if one is provided.

       MODERATE - 1
              Request a client certificate and do verification if one is provided. The connection
              is denied if the verification of the client provided certificate fails.

       STRICT - 2
              Request a client certificate and require one to be provided and verified.   If  the
              verification fails the failure is logged to diags.log and the connection is denied.

       Upstream  (server) verification, via verify_server_policy and verify_server_properties, is
       similar to client verification except there is always an  upstream  certificate.  This  is
       equivalent      to      setting      proxy.config.ssl.client.verify.server.policy      and
       proxy.config.ssl.client.verify.server.properties for this connection.

       verify_server_policy specifies how Traffic Server  will  enforce  the  server  certificate
       verification.

       DISABLED
              Do not verify the upstream server certificate.

       PERMISSIVE
              Do verification of the upstream certificate but do not enforce. If the verification
              fails the failure is logged in diags.log but the connection is allowed.

       ENFORCED
              Do verification of the upstream certificate. If verification fails, the failure  is
              logged in diags.log and the connection is denied.

       In  addition  verify_server_properties  specifies  what  Traffic  Server  will  check when
       performing the verification.

       NONE   Do not check anything in the standard Traffic Server  verification  routine.   Rely
              entirely on the TS_SSL_VERIFY_SERVER_HOOK for evaluating the origin's certificate.

       SIGNATURE
              Check the signature of the origin certificate.

       NAME   Verify that the SNI is in the origin certificate.

       ALL    Verify both the signature and the SNI in the origin certificate.

       If  tunnel_route  is  specified, none of the certificate verification will be done because
       the TLS negotiation  will  be  tunneled  to  the  upstream  target,  making  those  values
       irrelevant  for  that  configuration  item. This option is explained in more detail in SNI
       Routing.

EXAMPLES

       Disable HTTP/2 for no-http2.example.com.

          sni:
          - fqdn: no-http2.example.com
            http2: off

       Require client certificate verification for  foo.com  and  any  server  name  ending  with
       .yahoo.com.  Therefore,  client  request  for  a  server name ending with yahoo.com (e.g.,
       def.yahoo.com, abc.yahoo.com etc.) will cause Traffic Server require and verify the client
       certificate.

       For  foo.com,  if the user agent sets the host header to foo.com but the SNI to some other
       value, Traffic Server will warn about the mismatch but continue to  process  the  request.
       Mismatches for the other domains will cause Traffic Server to warn and return 403.

       Traffic  Server  will  allow a client certificate to be provided for example.com and if it
       is, Traffic Server will require the certificate to be valid.

          sni:
          - fqdn: example.com
            verify_client: MODERATE
          - fqdn: 'foo.com'
            verify_client: STRICT
            host_sni_policy: PERMISSIVE
          - fqdn: '*.yahoo.com'
            verify_client: STRICT

       Disable outbound server certificate verification for  trusted.example.com  and  require  a
       valid client certificate.

          sni:
          - fqdn: trusted.example.com
            verify_server_policy: DISABLED
            verify_client: STRICT

       Use FQDN captured group to match in tunnel_route.

          sni:
          - fqdn: '*.foo.com'
            tunnel_route: '$1.myfoo'
          - fqdn: '*.bar.*.com'
            tunnel_route: '$2.some.$1.yahoo'

       FQDN  some.foo.com will match and the captured string will be replaced in the tunnel_route
       which will end up  being  some.myfoo.   Second  part  is  using  multiple  groups,  having
       bob.bar.example.com as FQDN, tunnel_route will end up being bar.some.bob.yahoo.

SEE ALSO

       SNI Routing

COPYRIGHT

       2023, dev@trafficserver.apache.org