.. Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.

====================
ssl_multicert.config
====================

.. configfile:: ssl_multicert.config

The :file:`ssl_multicert.config` file lets you configure Traffic
Server to use multiple SSL server certificates to terminate the SSL
sessions. If you have a Traffic Server system with more than one
IP address assigned to it, then you can assign a different SSL
certificate to be served when a client requests a particular IP
address or host name.

At configuration time, certificates are parsed to extract the
certificate subject and all the DNS `subject alternative names
<http://en.wikipedia.org/wiki/SubjectAltName>`_.  A certificate
will be presented for connections requesting any of the hostnames
found in the certificate. Wildcard names are supported, but only
of the form `*.domain.com`, ie. where `*` is the leftmost domain
component.

Changes to :file:`ssl_multicert.config` can be applied to a running
Traffic Server using :option:`traffic_ctl config reload`.

Format
======

Each :file:`ssl_multicert.config` line consists of a sequence of
`key=value` fields that specify how Traffic Server should use a
particular SSL certificate.

ssl_cert_name=FILENAME[,FILENAME ...]
  The name of the file containing the TLS certificate. *FILENAME*
  is located relative to the directory specified by the
  :ts:cv:`proxy.config.ssl.server.cert.path` configuration variable.
  It may also include the intermediate CA certificates, sorted from
  leaf to root.  At a minimum, the file must include a leaf
  certificate.

  When running with OpenSSL 1.0.2 or later, this directive can be
  used to configure the intermediate CA chain on a per-certificate
  basis.  Multiple chain files are separated by comma character.
  For example, it is possible able to configure a ECDSA certificate
  chain and a RSA certificate chain and serve them simultaneously,
  allowing OpenSSL to determine which certificate would be used
  when the TLS session cipher suites are negotiated.  Note that the
  leaf certs in `FILENAME1` and `FILENAME2` must have the same
  subjects and alternate names. The first certificate is used to
  to match the client's SNI request.

  You can also configure multiple leaf certificates in a same chain
  with OpenSSL 1.0.1.

  This is the only field that is required to be present.

dest_ip=ADDRESS (optional)
  The IP (v4 or v6) address that the certificate should be presented
  on. This is now only used as a fallback in the case that the TLS
  ServerNameIndication extension is not supported. If *ADDRESS* is
  `*`, the corresponding certificate will be used as the global
  default fallback if no other match can be made. The address may
  contain a port specifier, in which case the corresponding certificate
  will only match for connections accepted on the specified port.
  IPv6 addresses must be enclosed by square brackets if they have
  a port, eg, [::1]:80. Care should be taken to make each ADDRESS unique.

ssl_key_name=FILENAME (optional)
  The name of the file containing the private key for this certificate.
  If the key is contained in the certificate file, this field can
  be omitted, otherwise *FILENAME* is resolved relative to the
  :ts:cv:`proxy.config.ssl.server.private_key.path` configuration variable.

ssl_ca_name=FILENAME (optional)
  If the certificate is issued by an authority that is not in the
  system CA bundle, additional certificates may be needed to validate
  the certificate chain. *FILENAME* is resolved relative to the
  :ts:cv:`proxy.config.ssl.CA.cert.path` configuration variable.

ssl_ocsp_name=FILENAME (optional)
  The name of the file containing the prefetched OCSP stapling response
  for this certificate. This field can be omitted to let trafficserver
  fetch OCSP responses dynamically. Otherwise, when included, the administrator is
  responsible for updating the file's content. *FILENAME* is resolved
  relative to the :ts:cv:`proxy.config.ssl.ocsp.response.path`
  configuration variable.

ssl_ticket_enabled=1|0 (optional)
  Enable RFC 5077 stateless TLS session tickets. To support this,
  OpenSSL should be upgraded to version 0.9.8f or higher. This
  option must be set to `0` to disable session ticket support.

ssl_ticket_number=INTEGER (optional)
  Specifies the number of TLSv1.3 session tickets that are issued.
  This defaults to 2 (the OpenSSL default)

ssl_key_dialog=builtin|"exec:/path/to/program [args]" (optional)
  Method used to provide a pass phrase for encrypted private keys.  If the
  pass phrase is incorrect, SSL negotiation for this dest_ip will fail for
  clients who attempt to connect.
  Two options are supported: builtin and exec:

    ``builtin`` - Requests pass phrase via stdin/stdout. User will be
      provided the ssl_cert_name and be prompted for the pass phrase.
      Useful for debugging.

    ``exec:`` - Executes program /path/to/program and passes args, if
      specified, to the program and reads the output from stdout for
      the pass phrase.  If args are provided then the entire exec: string
      must be quoted with "" (see examples).  Arguments with white space
      are supported by single quoting (').  The intent is that this
      program runs a security check to ensure that the system is not
      compromised by an attacker before providing the pass phrase.

Certificate Selection
=====================

Traffic Server attempts two certificate selections during SSL
connection setup. An initial selection is made when a TCP connection
is accepted. This selection examines the IP address and port that
the client is connecting to and chooses the best certificate from
the those that have a ``dest_ip`` specification. If no matching
certificates are found, a default certificate is chosen.  The final
certificate selection is made during the SSL handshake.  At this
point, the client may use `Server Name Indication
<http://en.wikipedia.org/wiki/Server_Name_Indication>`_ to request
a specific hostname. Traffic Server will use this request to select
a certificate with a matching subject or subject alternative name.
Failing that, a wildcard certificate match is attempted. If no match
can be made, the initial certificate selection remains in force.

In all cases, Traffic Server attempts to select the most specific
match. An address specification that contains a port number will
take precedence over a specification that does not contain a port
number. A specific certificate subject will take precedence over a
wildcard certificate. In the case of multiple matching certificates
the first match will be returned to non-SNI capable clients.

Examples
========

The following example configures Traffic Server to use the SSL
certificate ``server.pem`` for all requests to the IP address
111.11.11.1 and the SSL certificate ``server1.pem`` for all requests
to the IP address 11.1.1.1. Connections from all other IP addresses
are terminated with the ``default.pem`` certificate.
Since the private key is included in the certificate files, no
private key name is specified.

::

    dest_ip=111.11.11.1 ssl_cert_name=server.pem
    dest_ip=11.1.1.1 ssl_cert_name=server1.pem
    dest_ip=* ssl_cert_name=default.pem

The following example configures Traffic Server to use the ECDSA
certificate chain ``ecdsa.pem`` or RSA certificate chain ``rsa.pem``
for all requests.

::

    dest_ip=* ssl_cert_name=ecdsa.pem,rsa.pem

The following example configures Traffic Server to use the ECDSA
certificate chain ``ecdsa.pem`` or RSA certificate chain ``rsa.pem``
for all requests, the public key and private key are in separate PEM files.
Note that the number of files in ssl_key_name must match the files in ssl_cert_name,
and they should be presented in the same order.

::

    dest_ip=* ssl_cert_name=ecdsa_pub.pem,rsa_pub.pem ssl_key_name=ecdsa_private.pem,rsa_private.pem

The following example configures Traffic Server to use the SSL
certificate ``server.pem`` and the private key ``serverKey.pem``
for all requests to port 8443 on IP address 111.11.11.1. The
``general.pem`` certificate is used for server name matches.

::

     dest_ip=111.11.11.1:8443 ssl_cert_name=server.pem ssl_key_name=serverKey.pem ssl_cert_name=general.pem

The following example configures Traffic Server to use the SSL
certificate ``server.pem`` for all requests to the IP address
111.11.11.1. Session tickets are enabled with a persistent ticket
key.

::

    dest_ip=111.11.11.1 ssl_cert_name=server.pem ssl_ticket_enabled=1 ticket_key_name=ticket.key

The following example configures Traffic Server to use the SSL
certificate ``server.pem`` and disable session tickets for all
requests to the IP address 111.11.11.1.

::

    dest_ip=111.11.11.1 ssl_cert_name=server.pem ssl_ticket_enabled=0

The following examples configure Traffic Server to use the SSL
certificate ``server.pem`` which includes an encrypted private key.
The external program /usr/bin/mypass will be called on startup with one
parameter (foo) in the first example, and with two parameters (foo)
and (ba r) in the second example, the program (mypass) will return the
pass phrase to decrypt the keys.

::

    ssl_cert_name=server1.pem ssl_key_dialog="exec:/usr/bin/mypass foo"
    ssl_cert_name=server2.pem ssl_key_dialog="exec:/usr/bin/mypass foo 'ba r'"
