## ProFTPD module `mod_tls`

This module is contained in the `mod_tls.c` file for ProFTPD 1.2.x/1.3.x, and is not compiled by default. Installation instructions are discussed here.

The most current version of `mod_tls` is distributed with the ProFTPD source code.

This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/).

This product includes cryptographic software written by Eric Young (eay@cryptsoft.com).

## Author

Please contact TJ Saunders <tj at castaglia.org> with any questions, concerns, or suggestions regarding this module.

## Thanks

2002-09-01: Thanks to Peter 'Luna' Runestig <peter at runestig.com> for his original `mod_tls`, upon which this version is based. His module can be found here:

      ftp://ftp.runestig.com/pub/proftpd-tls/

## Directives

- TLSCACertificateFile
- TLSCACertificatePath
- TLSCARevocationFile
- TLSCARevocationPath
- TLSCertificateChainFile
- TLSCipherSuite
- TLSControlsACLs
- TLSCryptoDevice
- TLSDHParamFile
- TLSDSACertificateFile
- TLSDSACertificateKeyFile
- TLSEngine
- TLSLog
- TLSOptions
- TLSPKCS12File
- TLSPassPhraseProvider
- TLSProtocol
- TLSRandomSeed
- TLSRenegotiate
- TLSRequired
- TLSRSACertificateFile
- TLSRSACertificateKeyFile
- TLSSessionCache
- TLSTimeoutHandshake
- TLSVerifyClient
- TLSVerifyDepth
- TLSVerifyOrder

## Control Actions

- `tls sesscache clear`
- `tls sesscache info`
- `tls sesscache remove`

## TLSCACertificateFile

Syntax: TLSCACertificateFile file
Default: None
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.2.7rc1 and later

The `TLSCACertificateFile` directive configures one file where you can assemble the certificates of Certification Authorities (CA) for your clients. The CA certificates in the file are then used to verify client certificates, if presented. Such a file is merely the concatenation of the various PEM-encoded CA certificates, in order of preference. This directive can be used in addition to, or as an alternative for, `TLSCACertificatePath`.

Example:

      TLSCACertificateFile /etc/ftpd/ca-bundle.pem

If neither `TLSCACertificateFile` nor `TLSCACertificatePath` are specified, the following message will appear in the `TLSLog`:

       using default OpenSSL verification locations (see $SSL_CERT_DIR)

This means that the `SSL_CERT_DIR` environment variable, if set, will be used to determine the location of a CA certificate directory, to be used when verifying clients. Note, though, that this directive is only meaningful if `TLSVerifyClient` is set to on; otherwise, no client verification occurs.

See also: `TLSCACertificatePath`

## TLSCACertificatePath

Syntax: TLSCACertificatePath directory
Default: None
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.2.7rc1 and later

The `TLSCACertificatePath` directive sets the directory for the certificates of Certification Authorities (CAs) for your clients. These are used to verify the client certificates presented. This directive may be used in addition to, or as alternative for, `TLSCACertificateFile`.

The files in the configured directory have to be PEM-encoded, and are accessed through hash filenames. This means one cannot simply place the CA certificates there: one also has to create symbolic links named hash-value.N. The `c_rehash` utility that comes with OpenSSL can be used to create the necessary symlinks.

Example:

      TLSCACertificatePath /etc/ftpd/ca/

If neither `TLSCACertificateFile` nor `TLSCACertificatePath` are specified, the following message will appear in the `TLSLog`:

       using default OpenSSL verification locations (see $SSL_CERT_DIR)

This means that the `SSL_CERT_DIR` environment variable, if set, will be used to determine the location of a CA certificate directory, to be used when verifying clients.

See also: `TLSCACertificateFile`

## TLSCARevocationFile

Syntax: TLSCARevocationFile file
Default: None
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.2.7rc1 and later

The `TLSCARevocationFile` directive configures one file that can contain the Certificate Revocation Lists (CRL) of Certification Authorities (CA) for your clients. These CRLs are used during the verification of client certificates, if presented. Such a file is merely the concatenation of the various PEM-encoded CRL files, in order of preference. This directive can be used in addition to, or as an alternative for, `TLSCARevocationPath`.

Example:

      TLSCARevocationFile /etc/ftpd/ca-crl-bundle.pem

See also: `TLSCARevocationPath`

## TLSCARevocationPath

Syntax: TLSCARevocationPath directory
Default: None
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.2.7rc1 and later

The `TLSCARevocationPath` directive sets the directory for the Certificate Revocation Lists (CRL) of Certification Authorities (CAs) for your clients. These are used during the verification of client certificates, if presented. This directive may be used in addition to, or as alternative for, `TLSCARevocationFile`.

The files in the configured directory have to be PEM-encoded, and are accessed through hash filenames. This means one cannot simply place the CRLs there: one also has to create symbolic links named hash-value.N. The `c_rehash` utility that comes with OpenSSL can be used to create the necessary symlinks.

Example:

      TLSCARevocationPath /etc/ftpd/crl/

See also: `TLSCARevocationFile`

## TLSCertificateChainFile

Syntax: TLSCertificateChainFile file
Default: None
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.2.7rc1 and later

The `TLSCertificateChainFile` directive sets the optional all-in-one file where you can assemble the certificates of Certification Authorities (CA) which form the certificate chain of the server certificate. This starts with the issuing CA certificate of the server certificate and can range up to the root CA certificate. Such a file is simply the concatenation of the various PEM-encoded CA Certificate files in certificate chain order. (Certificate chain order means that the list must be sorted starting with the subject's certificate (actual server certificate), followed by intermediate CA certificates if applicable, and ending at the highest level root CA.) This server certificate chain is sent to the client, in addition to the server's certificate.

If `TLSCertificateChainFile` is not used, and `TLSCACertificatePath` is used, the certificate chain is built from the certificates in that path. `TLSCertificateChainFile` should be used as an alternative to `TLSCACertificatePath` for explicitly constructing the server certificate chain. It is especially useful to avoid conflicts with CA certificates when using client authentication. For although placing a CA certificate of the server certificate chain into the `TLSCACertificatePath` has the same effect for the certificate chain construction, it has the side-effect that client certificates issued by this same CA certificate are also accepted on client authentication. This is usually not what one expects.

Be careful: providing the certificate chain works only if you are using a single (either RSA or DSA) based server certificate. If you are using a coupled RSA+DSA certificate pair, this will work only if actually both certificates use the same certificate chain. Otherwise, clients will become confused.

Example:

      TLSCertificateChainFile /etc/ftpd/client-ca-list.pem

Note: If you use the `NoCertRequest` `TLSOption`, then any configured `TLSCertificateChainFile` directive will be ignored. It is a waste of time to construct a certificate chain to send to the client if the server does not request that the client send a certificate to be verified.

## TLSCipherSuite

Syntax: TLSCipherSuite cipher-list
Default: ALL:!ADH
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.2.7rc1 and later

Default cipher list is "ALL:!ADH".

How to put together a cipher list parameter:

      Key Exchange Algorithms:
        "kRSA"      RSA key exchange
        "kDHr"      Diffie-Hellman key exchange (key from RSA cert)
        "kDHd"      Diffie-Hellman key exchange (key from DSA cert)
        "kEDH'      Ephemeral Diffie-Hellman key exchange (temporary key)

      Authentication Algorithm:
        "aNULL"     No authentication
        "aRSA"      RSA authentication
        "aDSS"      DSS authentication
        "aDH"       Diffie-Hellman authentication

      Cipher Encoding Algorithm:
        "eNULL"     No encodiing
        "DES"       DES encoding
        "3DES"      Triple DES encoding
        "RC4"       RC4 encoding
        "RC2"       RC2 encoding
        "IDEA"      IDEA encoding

      MAC Digest Algorithm:
        "MD5"       MD5 hash function
        "SHA1"      SHA1 hash function
        "SHA"       SHA hash function (should not be used)

      Aliases:
        "ALL"       all ciphers
        "SSLv2"     all SSL version 2.0 ciphers (should not be used)
        "SSLv3"     all SSL version 3.0 ciphers
        "EXP"       all export ciphers (40-bit)
        "EXPORT56"  all export ciphers (56-bit)
        "LOW"       all low strength ciphers (no export)
        "MEDIUM"    all ciphers with 128-bit encryption
        "HIGH"      all ciphers using greater than 128-bit encryption
        "RSA"       all ciphers using RSA key exchange
        "DH"        all ciphers using Diffie-Hellman key exchange
        "EDH"       all ciphers using Ephemeral Diffie-Hellman key exchange
        "ADH"       all ciphers using Anonymous Diffie-Hellman key exchange
        "DSS"       all ciphers using DSS authentication
        "NULL"      all ciphers using no encryption

Each item in the list may include a prefix modifier:

        "+"         move cipher(s) to the current location in the list
        "-"         remove cipher(s) from the list (may be added again by a
                    subsequent list entry)
        "!"         kill cipher from the list (it may not be added again by a
                    subsequent list entry)

If no modifier is specified the entry is added to the list at the current position. "+" may also be used to combine tags to specify entries such as "RSA+RC4" describes all ciphers that use both RSA and RC4.

For example, all available ciphers not including ADH key exchange:

      ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP

All algorithms including ADH and export but excluding patented algorithms:

      HIGH:MEDIUM:LOW:EXPORT56:EXP:ADH:!kRSA:!aRSA:!RC4:!RC2:!IDEA

The OpenSSL command

      openssl ciphers -v <list of ciphers>

may be used to list all of the ciphers and the order described by a specific <list of ciphers>.

## TLSControlsACLs

Syntax: TLSControlsACLs actions|"all" "allow"|"deny" "user"|"group" list
Default: None
Context: server config
Module: mod_tls
Compatibility: 1.3.3rc1 and later

The `TLSControlsACLs` directive configures access lists of users or groups who are allowed (or denied) the ability to use the actions implemented by `mod_tls`. The default behavior is to deny everyone unless an ACL allowing access has been explicitly configured.

If "allow" is used, then list, a comma-delimited list of users or groups, can use the given actions; all others are denied. If "deny" is used, then the list of users or groups cannot use actions all others are allowed. Multiple `TLSControlsACLs` directives may be used to configure ACLs for different control actions, and for both users and groups.

The actions provided by `mod_tls` are "sesscache clear" , "sesscache info", and "sesscache remove".

Examples:

      # Allow only user root to examine/update the external SSL session cache
      TLSControlsACLs all allow user root

## TLSCryptoDevice

Syntax: TLSCryptoDevice driver|"all"|"none"
Default: None
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.3.1rc1 and later

The `TLSCryptoDevice` directive is used to configure `mod_tls` to use an OpenSSL "engine", a cryptographic module that OpenSSL library can use for accelerated cryptographic support, or HSM keys, etc.

To use all of the engines compiled into OpenSSL, use:

      TLSCryptoDevice all

OpenSSL will find, from the list of supported engines, the first one usable, if any. If no usable engines are found, OpenSSL will default to its normal software implementation. If a specific engine is desired as the default engine to use, specify the engine name, e.g.:

      TLSCryptoDevice chil

The OpenSSL command

      openssl engine

may be used to list all of the engine drivers supported by OpenSSL.

## TLSDHParamFile

Syntax: TLSDHParamFile file
Default: None
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.2.7rc1 and later

The `TLSDHParamFile` directive is used to configure a file that `mod_tls` will use when engaging in a Diffie-Hellman key exchange. Such a key exchange can be computationally intensive, in terms for parameter generation; to help speed up the process, the parameters used may be generated in advance, and stored in a file. The `dhparam` utility that comes with OpenSSL may be used to generate an appropriate file for this directive. The file parameter must be an absolute path.

## TLSDSACertficateFile

Syntax: TLSDSACertificateFile file
Default: None
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.2.7rc1 and later

The `TLSDSACertificateFile` directive points to the PEM-encoded file containing the DSA certificate file for the server and optionally also the corresponding DSA private key file.

If the contained private key is encrypted, the administrator will be prompted for the passphrase when the daemon starts up, and when the daemon is restarted. Alternatively, the `TLSPassPhraseProvider` directive can be used to supply a source for that passphrase.

Example:

      TLSDSACertificateFile /etc/ftpd/server-dsa-cert.pem

## TLSDSACertificateKeyFile

Syntax: TLSDSACertificateKeyFile file
Default: None
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.2.7rc1 and later

The `TLSDSACertificateKeyFile` directive points to the PEM-encoded private key file for the server. If the private key is not combined with the certificate in the `TLSDSACertificateFile`, use this additional directive to point to the file with the standalone private key. When `TLSDSACertificateFile` is used and the file contains both the certificate and the private key, this directive need not be used. However, this practice is strongly discouraged. Instead we recommend you to separate the certificate and the private key.

If the contained private key is encrypted, the administrator will be prompted for the passphrase when the daemon starts up, and when the daemon is restarted.

Example:

      TLSDSACertificateKeyFile /etc/ftpd/server-dsa-key.pem

## TLSEngine

Syntax: TLSEngine on|off
Default: off
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.2.7rc1 and later

The `TLSEngine` directive toggles the use of the SSL/TLS protocol engine (e.g. `mod_tls`). This is usually used inside a `<VirtualHost>` section to enable SSL/TLS sessions for a particular virtual host. By default `mod_tls` is disabled for both the main server and all configured virtual hosts.

## TLSLog

Syntax: TLSLog file
Default: None
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.2.7rc1 and later

The `TLSLog` directive is used to specify a log file for `mod_tls`'s reporting on a per-server basis. The file parameter given must be the full path to the file to use for logging.

Note that this path must not be to a world-writable directory and, unless `AllowLogSymlinks` is explicitly set to on (generally a bad idea), the path must not be a symbolic link.

## TLSOptions

Syntax: TLSOptions opt1 ...
Default: None
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.2.7rc1 and later

The `TLSOptions` directive is used to configure various optional behavior of `mod_tls`. Note: all of the configured `TLSOptions` parameters must appear on the same line in the configuration; only the first `TLSOptions` directive that appears in the configuration is used.

Example:

      TLSOptions iPAddressRequired StdEnvVars NoSessionReuseRequired

The currently implemented options are:

- `AllowClientRenegotiations`

  The `mod_tls` will reject any SSL/TLS session renegotiation attempts by the client, in order to mitigate any issues arising from the SSL/TLS session renegotiation vulnerability (CVE-2009-3555) or SSL/TLS session renegotiation DoS (CVE-2011-1473). If, however, your particular site or clients absolutely require support for client-initiated SSL/TLS session renegotiations, then this option can be used. Not recommended.

  Note, however, that SSL/TLS session renegotiation requests that are initiated by `mod_tls`, via the `TLSRenegotiate` directive, are still handled (depending on the OpenSSL version).

- `AllowDotLogin`

  By default, `mod_tls` still requires that a user supply a password for authentication, even if a valid client certificate is presented. If this option is enabled, `mod_tls` will check in the user's home directory for a `.tlslogin` file, which should contain one or more PEM-encoded certificates. If the certificate presented by the client, if any, matches a certificate in this `.tlslogin` file, the user will be considered authenticated and the server will not prompt for a password. If the user's `.tlslogin` does not exist, or does not contain the client's certificate, then the server will fallback to requesting a password for authentication.

- `AllowPerUser`

  This option affects how `mod_tls` evaluates any `TLSRequired` directives. Usually `mod_tls` will reject any FTP commands, when `TLSRequired on` or `TLSRequired ctrl` is in effect, if the client has not successfully negotiated a SSL/TLS handshake. The FTPS specification requires that the SSL/TLS handshake occur, via the AUTH FTP command, before the USER and PASS commands. This means that `mod_tls` does not know the identity of the connecting client when enforcing `TLSRequired`. If this `AllowPerUser` is used, `mod_tls` will wait until after the `PASS` command has been processed to enforce any `TLSRequired` settings.

  Important: if `AllowPerUser` is used, even if `TLSRequired on` or `TLSRequired ctrl` are in effect, it will be possible for the connecting client to send usernames and password unprotected before `mod_tls` rejects the connection. This results in a slightly weaker security policy enforcement; please consider carefully if this tradeoff is acceptable for your site.

  However, `TLSRequired auth` and `TLSRequired auth+data` configurations will override the `AllowPerUser` option.

- `CommonNameRequired`

  This option will cause `mod_tls` to perform checks on a client's certificate once the SSL handshake has been completed: the client's certificate will be searched for the `CommonName` (CN) X509v3 value. Unless a `CommonName` value is present, and the value matches the DNS name to which the client's IP address resolves, the SSL session is closed. This check is only performed during SSL handshakes on the control channel. Note that if `UseReverseDNS` is off, this option is automatically disabled.

- `EnableDiags`
  Sets callbacks in the OpenSSL library such that a lot of SSL/TLS protcol information is logged to the `TLSLog` file. This option is very useful when debugging strange interactions with FTPS clients.

- `ExportCertData`

  Sets the following environment variables, if applicable. Note that doing so increases the memory size of the process quite a bit:

  `TLS_SERVER_CERT` | Server certificate, PEM-encoded
  `TLS_CLIENT_CERT` | Client certificate, PEM-encoded
  `TLS_CLIENT_CERT_CHAINn` | PEM-encoded certificates in client certificate chain

- `NoCertRequest`

  Some FTP clients are known to be buggy when handling a server's certificate request. This option causes the server to not send such a request during an SSL handshake.

- `NoEmptyFragments`

  In order to prevent certain attacks (e.g. the so-called "BEAST" attack), the `mod_tls/code> module was changed to use OpenSSL's builtin countermeasure of inserting empty fragments. However, some browsers/clients may not handle such empty fragments well. Use this `NoEmptyFragaments` TLSOption in order to interoperate with such clients, with risk of losing the protective countermeasure.`

  Note that this protective countermeasure only applies to SSLv3 and TLSv1 sessions; it does not affect TLSv1.1 or TLSv1.2 sessions.

  Added in ProFTPD 1.3.4rc4.

- `NoSessionReuseRequired`

  As of ProFTPD 1.3.3rc1, `mod_tls` only accepts SSL/TLS data connections that reuse the SSL session of the control connection, as a security measure. Unfortunately, there are some clients (e.g. curl) which do not reuse SSL sessions.

  To relax the requirement that the SSL session from the control connection be reused for data connections, use the following in the proftpd.conf:

          <IfModule mod_tls.c>
            ...
            TLSOptions NoSessionReuseRequired
            ...
          </IfModule>

- `StdEnvVars`

  Sets the following environment variables, if applicable. These environment variables are then avaiable for use, such as in `LogFormat`s. Note that doing so may increase the memory size of the process quite a bit:

  `FTPS` | Present if FTP over SSL/TLS is being used
  `TLS_PROTOCOL` | SSL protocol version (e.g. SSLv3, TLSv1)
  `TLS_SESSION_ID` | Hex-encoded SSL session ID
  `TLS_CIPHER` | Cipher specification name
  `TLS_CIPHER_EXPORT` | Present if cipher is an export cipher
  `TLS_CIPHER_KEYSIZE_POSSIBLE` | Number of cipher bits possible
  `TLS_CIPHER_KEYSIZE_USED` | Number of cipher bits used
  `TLS_LIBRARY_VERSION` | OpenSSL version
  `TLS_CLIENT_M_VERSION` | Client certificate version
  `TLS_CLIENT_M_SERIAL` | Client certificate serial number
  `TLS_CLIENT_S_DN` | Subject DN of client certificate
  `TLS_CLIENT_S_DN_`x509 | Component of client certificate's Subject DN, where x509 is a component of a X509 DN: C,CN,D,I,G,L,O,OU,S,ST,T,UID,Email
  `TLS_CLIENT_I_DN` | Issuer DN of client certificate
  `TLS_CLIENT_I_DN_`x509 | Component of client certificate's Issuer DN, where x509 is a component of a X509 DN: C,CN,D,I,G,L,O,OU,S,ST,T,UID,Email
  `TLS_CLIENT_V_START` | Start time of client certificate validity
  `TLS_CLIENT_V_END` | End time of client certificate validity
  `TLS_CLIENT_A_SIG` | Client certificate's signature algorithm
  `TLS_CLIENT_A_KEY` | Client certificate's public key algorithm
  `TLS_CLIENT_CERT` | Client certificate, PEM-encoded
  `TLS_CLIENT_CERT_CHAINn` | PEM-encoded certificates in client certificate chain
  `TLS_SERVER_M_VERSION` | Server certificate version
  `TLS_SERVER_M_SERIAL` | Server certificate serial number
  `TLS_SERVER_S_DN` | Subject DN of server certificate
  `TLS_SERVER_S_DN_`x509 | Component of server certificate's Subject DN, where x509 is a component of a X509 DN: C,CN,D,I,G,L,O,OU,S,ST,T,UID,Email
  `TLS_SERVER_I_DN` | Issuer DN of server certificate
  `TLS_SERVER_I_DN_`x509 | Component of server certificate's Issuer DN, where x509 is a component of a X509 DN: C,CN,D,I,G,L,O,OU,S,ST,T,UID,Email
  `TLS_SERVER_V_START` | Start time of server certificate validity
  `TLS_SERVER_V_END` | End time of server certificate validity
  `TLS_SERVER_A_SIG` | Server certificate's signature algorithm
  `TLS_SERVER_A_KEY` | Server certificate's public key algorithm
  `TLS_SERVER_CERT` | Server certificate, PEM-encoded

- `UseImplicitSSL`

  This option will cause the `mod_tls` module to handle all connections as if they are SSL connections implicitly; the client does not need to send the `AUTH TLS` FTP command. This can cause issues for FTPS clients which are expecting explicit FTPS, not implicit FTPS.

  Thus if the `UseImplicitSSL` option is used, you will want to have a separate `<VirtualHost>` section with a different port number just for those clients which require/expect implicit FTPS. For example:

          <IfModule mod_tls.c>
            <VirtualHost a.b.c.d>
              TLSEngine on
              TLSOptions UseImplicitSSL

              # The "standard" implicit FTPS port is 990
              Port 990
              ...
            </VirtualHost>
          </IfModule>

- `dNSNameRequired`

  This option will cause `mod_tls` to perform checks on a client's certificate once the SSL handshake has been completed: the client's certificate will be searched for the `subjectAltName` X509v3 extension, and, in that extension, the `dNSName` value will be looked up. Unless a `dNSName` value is present, and the value matches the DNS name to which the client's IP address resolves, the SSL session is closed. This check is only performed during SSL handshakes on the control channel. Note that if `UseReverseDNS` is off, this option is automatically disabled.

- `iPAddressRequired`

  This option will cause `mod_tls` to perform checks on a client's certificate once the SSL handshake has been completed: the client's certificate will be searched for the `subjectAltName` X509v3 extension, and, in that extension, the `iPAddress` value will be looked up. Unless an `iPAddress` value is present, and the value matches the IP address of the client, the SSL session is closed. This check is only performed during SSL handshakes on the control channel.

## TLSPKCS12File

Syntax: TLSPKCS12File file
Default: None
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.3.3rc1 and later

The `TLSPKCS12ile` directive points to the PKCS#12 file containing the certificate file and its private key for the server.

If the PKCS#12 file is protected with a passphrase, the administrator will be prompted for the passphrase when the daemon starts up, and when the daemon is restarted. Alternatively, the `TLSPassPhraseProvider` directive can be used to supply a source for that passphrase.

Example:

      TLSPKCS12File /etc/ftpd/server-cert.p12

## TLSPassPhraseProvider

Syntax: TLSPassPhraseProvider path
Default: None
Context: server config
Module: mod_tls
Compatibility: 1.3.1rc1 and later

The `TLSPassPhraseProvider` directive is used to specify an external program which will be called, when `mod_tls` starts up, for each encrypted certificate key file. The program will be invoked with two command-line arguments, passed on `stdin` to the program:

      servername:portnumber "RSA"|"DSA"

where `servername:portnumber` indicates the server using that encrypted certificate key, and `"RSA"` or `"DSA"` indicates the private key algorithm used for that key. The program then must print the corresponding passphrase for the key to `stdout`.

The intent is that this external program can perform any security checks necessary, to make sure that the system is not compromised by an attacker, and only when these checks pass successfully will the passphrase be provided. These security checks, and the way the passphrase is determined, can be as complex as you like.

Example:

      TLSPassPhraseProvider /etc/ftpd/tls/get-passphrase

## TLSProtocol

Syntax: TLSProtocol protocol1 ... protocolN
Default: SSLv3 TLSv1
Context: server config
Module: mod_tls
Compatibility: 1.2.7rc1 and later

The `TLSProtocol` directive is used to configure the SSL/TLS protocol versions that `mod_tls` should use when establishing SSL/TLS sessions. Clients can then only connect using the configured protocol.

Since the protocol version used by `mod_tls` is set only once, when the daemon starts, the `TLSProtocol` directive is only allowed in the "server config" context.

The allowed protocols are:

`SSLv3` | Allow only SSLv3
`TLSv1` | Allow only TLSv1

To support both SSLv3 and TLSv1, simply list both parameters for the `TLSProtocol` directive, e.g.:

      TLSProtocol SSLv3 TLSv1

Note that the parameter "SSLv23" is supported as a legacy style for saying "all versions".

All use of SSLv2 is disabled. SSLv2 should not be used.

## TLSRandomSeed

Syntax: TLSRandomSeed seed
Default: openssl-dir`/.rnd`
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.2.7rc1 and later

The `TLSRandomSeed` directive configures the file that `mod_tls` will use for seeding the PRNG. seed must be an absolute path.

When the daemon shuts down, any random data left will be written out to the random seed file, so that that data may be used for seeding when the daemon is started again.

Example:

      TLSRandomSeed /etc/ftpd/server.rnd

Note that the `TLSRandomSeed` directive is not used to seed the entropy required by the OpenSSL library; that configuration is OpenSSL-specific. Instead, the `TLSRandomSeed` file can be thought of a cache file for the unused entropy, to be used to help speed up entropy gathering when the daemon starts up again.

## TLSRenegotiate

Syntax: TLSRenegotiate ["ctrl" secs] ["data" Kbytes] ["timeout" secs]|["required" on|off]|"none"
Default: ctrl 14400 data 25165824 required true (for OpenSSL 0.9.7 or greater)
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.2.7rc1 and later

The `TLSRenegotiate` directive is used to configure when SSL renegotiations are to occur. Renegotiations, and thus this directive, are only supported by `mod_tls` if the version of OpenSSL installed is 0.9.7 or greater.

If supported, renegotiations will occur on control channels that have been established for four hours by default, and on data channels that have transferred over one gigabyte of data by default. When renegotiations are requested, the client is given a timeout of 30 seconds, by default, to perform the renegotiation. To change the default control channel renegotiation timeout, use ctrl followed by a number, greater than zero, in seconds. Use data followed by a number, greater than zero, of kilobytes to change the default data channel renegotiation threshhold. The timeout parameter, followed by a positive number of seconds, is used to change the length of time given to a client to complete a requested renegotiation, after which the SSL session will be shutdown. By default, `mod_tls` will require that the client comply with the requested renegotiation within the `TLSRenegotiate` timeout. If, however, the client is unwilling or unable to do so, and the daemon needs to support these clients, set required to off. Doing so will cause renegotiations to be requested, but not required.

By default, `mod_tls` will perform renegotiations if supported, on the control channel after 4 hours, and on the data channel after one gigabyte of transferred data. The default timeout for a renegotiation is 30 seconds.

Use none to disable all renegotiation requirements.

Examples:

        # Change renegotiations to occur on control channels after 1 hour
        TLSRenegotiate ctrl 3600

        # Change renegotiations to occur on data channels after 500 MB
        TLSRenegotiate data 512000

        # Change renegotiations so that they are not required, only requested
        TLSRenegotiate required off

        # Change only the timeout for renegotiations to be 5 minutes
        TLSRenegotiate timeout 300

        # Change all of the above renegotiation threshholds using one directive
        TLSRenegotiate ctrl 3600 data 512000 required off timeout 300

        # To disable renegotiations entirely
        TLSRenegotiate none

## TLSRequired

Syntax: TLSRequired on|off|ctrl|[!]data|auth|auth+[!]data
Default: off
Context: server config, `<VirtualHost>`, `<Global>`, `<Anonymous>`
Module: mod_tls
Compatibility: 1.2.7rc1 and later

The `TLSRequired` directive is used to define a basic security policy, one that dictates whether the control channel, or data channel, or both, of an FTP session must occur over SSL/TLS.

The on parameter enables SSL/TLS requirements on both control and data channels; off disables the requirements on both channels. Use ctrl and data to require SSL/TLS on either channel individually.

Example:

      # Require SSL/TLS on the control channel, so that passwords are not sent
      # in the clear.
      TLSRequired ctrl

      # Require SSL/TLS on both channels.
      TLSRequired on

The auth parameter requires that SSL/TLS be used on the control channel, but only for authentication. To use this setting and require SSL/TLS for data transfers, use the auth+data parameter, e.g.:

      # Allow the client to use the CCC command to remove SSL/TLS from the
      # control channel, but only after authentication has been performed.
      # Still enforce the policy of using SSL/TLS for data transfers.
      #
      # Note that if we did not need to protect data transfers, we would
      # set 'TLSRequired auth' instead of using 'TLSRequired auth+data'.
      TLSRequired auth+data

This auth+data parameter allows a very specific security policy: authentication via the `USER`/`PASS` commands must be protected via SSL/TLS, as must the data channel, but after authenticating, the client can request that protection be removed from the control channel. This policy allows clients to use the `CCC` (Clear Command Channel) command, which in turn enables SSL/TLS protected data transfers that are operate better with firewalls that monitor the FTP control channel.

It is also possible to configure a policy which rejects use of SSL/TLS for protecting the data channel. Some sites may wish to use such a policy in order to protect the control channels of their clients, but to prevent the data transfers from consuming too much CPU. The `TLSRequired` directive can be set such that an FTPS client requesting protection of the data channel, using the `PROT` command, will have that command refused. To configure such a policy, use one of the following:

      # If the client wishes to protect the control channel, allow it; but reject
      # any attempt to protect the data channel
      TLSRequired !data

      # Require protection on the control channel, but reject protection of the
      # data channel
      TLSRequired ctrl+!data

      # Require protection on the control channel for authentication (but not
      # after), and reject protection of the data channel
      TLSRequired auth+!data

## TLSRSACertificateFile

Syntax: TLSRSACertificateFile file
Default: None
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.2.7rc1 and later

The `TLSRSACertificateFile` directive points to the PEM-encoded file containing the RSA certificate file for the server and optionally also the corresponding RSA private key file.

If the contained private key is encrypted, the administrator will be prompted for the passphrase when the daemon starts up, and when the daemon is restarted. Alternatively, the `TLSPassPhraseProvider` directive can be used to supply a source for that passphrase.

Example:

      TLSRSACertificateFile /etc/ftpd/server-rsa-cert.pem

## TLSRSACertificateKeyFile

Syntax: TLSRSACertificateKeyFile file
Default: None
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.2.7rc1 and later

The `TLSRSACertificateKeyFile` directive points to the PEM-encoded private key file for the server. If the private key is not combined with the certificate in the `TLSRSACertificateFile`, use this additional directive to point to the file with the standalone private key. When `TLSRSACertificateFile` is used and the file contains both the certificate and the private key, this directive need not be used. However, this practice is strongly discouraged. Instead we recommend you to separate the certificate and the private key.

If the contained private key is encrypted, the administrator will be prompted for the passphrase when the daemon starts up, and when the daemon is restarted.

Example:

      TLSRSACertificateKeyFile /etc/ftpd/server-rsa-key.pem

## TLSSessionCache

Syntax: TLSSessionCache type:/info [timeout]
Default: None
Context: server config
Module: mod_tls
Compatibility: 1.3.3rc1 and later

The `TLSSessionCache` directive configures an external SSL session cache, which can be used for storing and shared SSL sessions across multiple processes. An external SSL session cache is an optional facility which speeds up parallel FTPS session connections.

Modern FTP clients often create multiple simultaneous connections to an FTP server, for downloading different chunks of data in parallel. Each FTP connection will be handled by a different server process, and each one will be required to perform a full SSL/TLS handshake. By using an external SSL session cache, a cached SSL session can be "resumed" by the client, which avoids the expensive portions of the handshake. FTPS clients which cache the SSL session locally can also attempt to resume that cached session at a later date; if the server still has that same session cached, the FTPS client can again avoid the expensive portions of the handshake and resume its previous SSL session.

If the `TLSSessionCache` directive is not used, then OpenSSL's default internal SSL session caching will be used. Thus multiple SSL sessions to the same server process (e.g. for FTP data transfers) will benefit from the speedup, but parallel simultaneous FTP connections from the same FTPS client will each need to perform the full SSL/TLS handshake. By default, OpenSSL caches SSL sessions for 300 seconds (5 minutes). If your FTP sessions last longer than this (e.g. for downloading large files), you may need to configure a longer cache lifetime using:

      # Configure OpenSSL's internal caching to be 1800 seconds (30 minutes)
      TLSSessionCache internal: 1800

The type and info parameters all depend on the module implementing the external SSL session cache being configured. For example, for using a shared memory external SSL session cache, see the `mod_tls_shmcache` documentation.

The optional timeout parameters sets the time-to-live, in seconds, for the SSL session datal stored in the external SSL session cache. It can be set as low as 15 for testing, but should be set to higher values like 600 in real life. The default timeout is 1800 seconds (30 minutes).

## TLSTimeoutHandshake

Syntax: TLSTimeoutHandshake seconds
Default: 300
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.2.9rc1 and later

The `TLSTimeoutHandshake` directive configures the maximum number of seconds for `mod_tls` to accept an SSL/TLS handshake. If set to zero, `mod_tls` will wait forever for a handshake to complete. The default is 300 seconds (five minutes).

## TLSVerifyClient

Syntax: TLSVerifyClient on|off
Default: off
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.2.7rc1 and later

The `TLSVerifyClient` directive configures how `mod_tls` handles certificates presented by clients. If off, the module will accept the certificate and establish an SSL/TLS session, but will not verify the certificate. If on, the module will verify a client's certificate and, furthermore, will fail all SSL handshake attempts unless the client presents a certificate when the server requests one. Note that the server can be configured to not request a client certificate via the `TLSOptions` directive's "NoCertRequest" parameter.

See also: `TLSOptions`

## TLSVerifyDepth

Syntax: TLSVerifyDepth depth
Default: 9
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.2.7rc1 and later

The `TLSVerifyDepth` directive sets how deeply `mod_tls` should verify before deciding that the client does not have a valid certificate. The depth actually is the maximum number of intermediate certificate issuers, i.e. the number of CA certificates which are allowed to be followed while verifying the client certificate. A depth of 0 means that only self-signed client certificates are accepted, a depth of 1 means the client certificate can be self-signed or has to be signed by a CA which is directly known to the server (i.e. the CA's certificate is under `TLSCACertificatePath`), etc.

Example:

      TLSVerifyDepth 10

## TLSVerifyOrder

Syntax: TLSVerifyOrder crl|ocsp
Default: crl
Context: server config, `<VirtualHost>`, `<Global>`
Module: mod_tls
Compatibility: 1.3.2rc1 and later

The `TLSVerifyOrder` directive configures how the `mod_tls` will verify the certificates presented by clients, if at all. Unless `TLSVerifyClient` is on, the `TLSVerifyOrder` directive is not needed.

By default, the `mod_tls` module will include any CRLs (Certificate Revocation List) that may have been configured via the `TLSCARevocationFile` and/or `TLSCARevocationPath` directives. This default behavior is the equivalent of configuring the `TLSVerifyOrder` to use CRLs, e.g.:

      TLSVerifyOrder crl

Another way of checking the validity of the client certificate is to use the Online Certificate Status Protocol (OCSP), defined in RFC 2560. To configure the `mod_tls` module to use OCSP when verifying, use:

      TLSVerifyOrder ocsp

Note that at is possible for `mod_tls` to use both CRLs and OCSP when verifying certificates. Simply use `TLSVerifyOrder` to configure the order in which `mod_tls` should use the various verification mechanisms:

      TLSVerifyOrder ocsp crl

Verification ends when a mechanism can successfully verify the certificate.

See also: `TLSCARevocationFile`, `TLSCARevocationPath`

## Control Actions

### `tls sesscache clear`

Syntax: ftpdctl tls sesscache clear
Purpose: Clears all cached sessions from the SSL session cache

The `tls sesscache clear` action is used to clear all cached sessions, whether they have expired or not, from the configured external SSL session cache. For example:

      # ftpdctl tls sesscache clear
      ftpdctl: tls sesscache: cleared 1 session from 'shm' session cache

See also: `TLSSessionCache`

### `tls sesscache info`

Syntax: ftpdctl tls sesscache info [-v]
Purpose: Displays status of session cache

The `tls sesscache info` action is used to display information about the configured external SSL session cache. If the optional -v command-line option is used, then information about each cached session will also be displayed.

For example:

      # ftpdctl tls sesscache info -v
      ftpdctl: Shared memory (shm) SSL session cache provided by mod_tls_shmcache/0.1
      ftpdctl:
      ftpdctl: Shared memory segment ID: 589824
      ftpdctl: Shared memory segment size: 1576960 bytes
      ftpdctl: Shared memory cache created on: Mon Mar  9 21:18:05 2009
      ftpdctl: Shared memory attach count: 1
      ftpdctl:
      ftpdctl: Max session cache size: 153
      ftpdctl: Current session cache size: 1
      ftpdctl:
      ftpdctl: Cache lifetime hits: 0
      ftpdctl: Cache lifetime misses: 0
      ftpdctl:
      ftpdctl: Cache lifetime sessions stored: 1
      ftpdctl: Cache lifetime sessions deleted: 0
      ftpdctl: Cache lifetime sessions expired: 0
      ftpdctl:
      ftpdctl: Cache lifetime errors handling sessions in cache: 0
      ftpdctl: Cache lifetime sessions exceeding max entry size: 0
      ftpdctl:
      ftpdctl: Cached sessions:
      ftpdctl:   -----BEGIN SSL SESSION PARAMETERS-----
      ftpdctl:     Session ID: A9BB647E236BAB0EF128FE9EAD2ABEC6F8E65C9EB8F050A07D1F0F66EC3019DC
      ftpdctl:     Session ID Context: 00000000
      ftpdctl:     Protocol: TLSv1
      ftpdctl:     Started: Mon Mar  9 21:19:20 2009
      ftpdctl:     Expires: Tue Mar 10 21:19:20 2009 (86400 secs)
      ftpdctl:   -----END SSL SESSION PARAMETERS-----

See also: `TLSSessionCache`

### `tls sesscache remove`

Syntax: ftpdctl tls sesscache remove
Purpose: Removes the external SSL session cache

The `tls sesscache remove` action is used to remove the external SSL session cache entirely. Depending on the actual module providing the session cache, this may or may not be implemented.

For example:

      # ftpdctl tls sesscache remove
      ftpdctl: tls sesscache: removed 'shm' session cache

See also: `TLSSessionCache`

## Usage

Much of the documentation for Apache's `mod_ssl`, concerning certificates, OpenSSL usage, etc applies to this module as well:

      http://www.modssl.org/docs/2.7/

The OpenSSL documentation, and its FAQ, are recommended as well:

      http://www.openssl.org/docs/

There is also a script, `cert-tool`, that can help in the creation of certificates. See `cert-tool --help` for usage information:

      http://www.castaglia.org/openssl/contrib/cert-tool

A copy of the Draft describing FTP over SSL/TLS is included with the source code for this module.

## Installation

The `mod_tls` module is distributed with ProFTPD. Simply follow the normal steps for using third-party modules in proftpd:

      ./configure --with-modules=mod_tls
      make
      make install

Alternatively, `mod_tls` can be built as a DSO module:

      ./configure --enable-dso --with-shared=mod_tls ...

Then follow the usual steps:

      make
      make install

You may need to specify the location of the OpenSSL header and library files in your `configure command, e.g.:`

     ./configure --with-modules=mod_tls \
        --with-includes=/usr/local/openssl \
        --with-libraries=/usr/local/openssl

Author: $Author: castaglia $
Last Updated: $Date: 2011/10/10 21:02:09 $

© Copyright 2002-2011 TJ Saunders
All Rights Reserved