Provided by: trafficserver_9.2.5+ds-1ubuntu2_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.                                       │
     ├────────────────────────────────────────┼───────────┼──────────────────────────────────────────────────────┤
     │ http2_max_settings_frames_per_minute   │ Inbound   │ Specifies how many SETTINGS frames Traffic Server    │
     │                                        │           │ receives  per minute at maximum.  By default this    │
     │                                        │           │ is                                                   │
     │                                        │           │ proxy.config.http2.max_settings_frames_per_minute.   │
     │                                        │           │ NOTE: Connection coalescing may prevent this from    │
     │                                        │           │ taking effect.                                       │
     ├────────────────────────────────────────┼───────────┼──────────────────────────────────────────────────────┤
     │ http2_max_ping_frames_per_minute       │ Inbound   │ Specifies how  many  PING  frames  Traffic  Server   │
     │                                        │           │ receives  per  minute at maximum.  By default this   │
     │                                        │           │ is  proxy.config.http2.max_ping_frames_per_minute.   │
     │                                        │           │ NOTE:  Connection coalescing may prevent this from   │
     │                                        │           │ taking effect.                                       │
     ├────────────────────────────────────────┼───────────┼──────────────────────────────────────────────────────┤
     │ http2_max_priority_frames_per_minute   │ Inbound   │ Specifies how many PRIORITY frames Traffic  Server   │
     │                                        │           │ receives  per  minute at maximum.  By default this   │
     │                                        │           │ is                                                   │
     │                                        │           │ proxy.config.http2.max_priority_frames_per_minute.   │
     │                                        │           │ NOTE: Connection coalescing may prevent this  from   │
     │                                        │           │ taking effect.                                       │
     ├────────────────────────────────────────┼───────────┼──────────────────────────────────────────────────────┤
     │ http2_max_rst_stream_frames_per_minute │ Inbound   │ Specifies   how  many  RST_STREAM  frames  Traffic   │
     │                                        │           │ Server receives per minute at maximum.  By default   │
     │                                        │           │ this                                            is   │
     │                                        │           │ proxy.config.http2.max_rst_stream_frames_per_minute. │
     │                                        │           │ NOTE:  Connection coalescing may prevent this from   │
     │                                        │           │ 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

       2025, dev@trafficserver.apache.org

9.2                                               May 22, 2025                                       SNI.YAML(5)