mod_tls
mod_tls.c
file for ProFTPD
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).
Please contact TJ Saunders <tj at castaglia.org> with any questions, concerns, or suggestions regarding this module.
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/
<VirtualHost>
, <Global>
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
<VirtualHost>
, <Global>
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
<VirtualHost>
, <Global>
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
<VirtualHost>
, <Global>
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
<VirtualHost>
, <Global>
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.
<VirtualHost>
, <Global>
Default cipher list is "DEFAULT:!EXPORT:!DES".
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>.
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
<VirtualHost>
, <Global>
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 allOpenSSL 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 enginemay be used to list all of the engine drivers supported by OpenSSL.
<VirtualHost>
, <Global>
The TLSDHParamFile
directive is used to configure a file that
contains pre-computed Diffie-Hellman (DH) group parameters. The
mod_tls
module will use these parameters when engaging in
Diffie-Hellman key exchanges.
Such key exchanges can be computationally intensive, in terms for parameter
generation. To help speed up the process and avoid latency for Diffie-Hellman
key exchanges, the DH group parameters used may be generated in advance, and
stored in a TLSDHParamFile
. The dhparam
utility
that comes with OpenSSL may be used to generate an appropriate file for this
directive:
# openssl dhparam -outform PEM -2 nbits >> dhparams.pem # openssl dhparam -outform PEM -5 nbits >> dhparams.pemUsing either -2 or -5 as the generator is fine. The nbits value used should vary between 512 and 4096, inclusive.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 laterThe
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 laterThe
TLSDSACertificateKeyFile
directive points to the PEM-encoded private key file for the server. If the private key is not combined with the certificate in theTLSDSACertificateFile
, use this additional directive to point to the file with the standalone private key. WhenTLSDSACertificateFile
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
TLSECCertficateFile
Syntax: TLSECCertificateFile file
Default: None
Context: server config,<VirtualHost>
,<Global>
Module: mod_tls
Compatibility: 1.3.5rc4 and laterThe
TLSECCertificateFile
directive points to the PEM-encoded file containing the EC certificate file for the server and optionally also the corresponding EC 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:
TLSECCertificateFile /etc/ftpd/server-ec-cert.pem
TLSECCertificateKeyFile
Syntax: TLSECCertificateKeyFile file
Default: None
Context: server config,<VirtualHost>
,<Global>
Module: mod_tls
Compatibility: 1.3.5rc4 and laterThe
TLSECCertificateKeyFile
directive points to the PEM-encoded private key file for the server. If the private key is not combined with the certificate in theTLSECCertificateFile
, use this additional directive to point to the file with the standalone private key. WhenTLSECCertificateFile
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:
TLSECCertificateKeyFile /etc/ftpd/server-ec-key.pem
TLSEngine
Syntax: TLSEngine on|off
Default: off
Context: server config,<VirtualHost>
,<Global>
Module: mod_tls
Compatibility: 1.2.7rc1 and laterThe
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 defaultmod_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 laterThe
TLSLog
directive is used to specify a log file formod_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.
TLSMasqueradeAddress
Syntax: TLSMasqueradeAddress ip-address|dns-name|device-name
Default: None
Context: server config,<VirtualHost>
Module: mod_tls
Compatibility: 1.3.5rc2 and laterThe
TLSMasqueradeAddress
directive functions exactly like theMasqueradeAddress
, except that it applies only to FTPS sessions. (Note that if bothMasqueradeAddress
andTLSMasqueradeAddress
are configured, then theTLSMasqueradeAddress
directive will take precedence, but only for FTPS sessions.)Discussion
Why is something likeTLSMasqueradeAddress
needed? There are cases where some sites runproftpd
within a restricted VLAN/DMZ, with some sort of firewall/proxy/router device which handles FTP and FTPS connections from the Internet to thatproftpd
server:client <---> firewall <---> load balancer <---> serverIn many cases, the firewall/proxy/router device will look at the FTP responses for thePASV
/EPSV
commands (in whichproftpd
may be sending its internal, non-public IP address), and rewrite the responses to have the IP address of the firewall/proxy/router device.Normally, the
MasqueradeAddress
directive can be used for such cases, so thatproftpd
sends the configured address in thePASV
/EPSV
responses. With that configuration, the firewall/proxy/router device will not need to rewrite the responses. And this approach works for FTPS sessions as well, where the firewall/proxy/router device cannot rewrite the response due to the SSL/TLS protection.Sometimes, though, sites want their firewall/proxy/router device to be able to properly rewrite FTP responses. But due to bugs/implementation details in the firewall/proxy/router devices, if a
PASV
/EPSV
response contains a public IP address, the device will drop/break that FTP connection.This leaves the site in a case where it does not want to use
MasqueradeAddress
(so that the device can properly rewrite FTP responses), which works -- but only for plain FTP sessions. Yet the site does want to useMasqueradeAddress
-- but only for FTPS sessions, since the device cannot rewrite FTPS responses.For these situations, then, the
TLSMasqueradeAddress
directive can/should be used: it providesMasqueradeAddress
functionality, but only for FTPS sessions.
TLSOptions
Syntax: TLSOptions opt1 ...
Default: None
Context: server config,<VirtualHost>
,<Global>
Module: mod_tls
Compatibility: 1.2.7rc1 and laterThe
TLSOptions
directive is used to configure various optional behavior ofmod_tls
. Note: all of the configuredTLSOptions
parameters must appear on the same line in the configuration; only the firstTLSOptions
directive that appears in the configuration is used.Example:
TLSOptions iPAddressRequired StdEnvVars NoSessionReuseRequiredThe 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
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
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.
<VirtualHost>
, <Global>
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
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
<VirtualHost>
, <Global>
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 |
TLSv1.1 |
Allow only TLSv1.1 |
TLSv1.2 |
Allow only TLSv1.2 |
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.
/.rnd
<VirtualHost>
, <Global>
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.
<VirtualHost>
, <Global>
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
<VirtualHost>
, <Global>
, <Anonymous>
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 onThe 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+dataThis 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
<VirtualHost>
, <Global>
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
<VirtualHost>
, <Global>
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
<VirtualHost>
, <Global>
When choosing a cipher during an SSLv3 or TLSv1 handshake, normally the
client's ciphersuite preference is used. If the
TLSServerCipherPreference
directive is enabled, then the
server's ciphersuite preference will be used instead.
For example:
TLSServerCipherPreference on
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).
Use of SSL session caching can be disabled entirely by using:
TLSSessionCache off
<VirtualHost>
, <Global>
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).
<VirtualHost>
, <Global>
The TLSUserName
directive configures which attribute
of a client certificate to match against the name provided by the FTPS client
in its USER
command. If the certificate attribute
value matches the USER
name, the user is considered to be
authenticated without requiring that password be sent over the network.
The attribute can either be "CommonName" (to match the CN of the
client certificate to the requested USER
name),
"EmailSubjAltName" (to match any Email Subject Alternative Names (SANs)
to the requested USER
name), or a custom OID.
Examples:
# Match the CN TLSUserName CommonName # Match any Email SANs TLSUserName EmailSubjAltName # Match specific (custom) OID TLSUserName 1.2.3.4.5
Note that for the TLSUserName
directive to be effective,
mod_tls
has to be configured to request that clients provide
certificates, i.e.:
# Verify clients TLSVerifyClient on # and possibly verify the user based on the client certs TLSUserName CommonName
See also: TLSVerifyClient
<VirtualHost>
, <Global>
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
<VirtualHost>
, <Global>
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
<VirtualHost>
, <Global>
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 ocspNote 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 crlVerification ends when a mechanism can successfully verify the certificate.
See also: TLSCARevocationFile
,
TLSCARevocationPath
<VirtualHost>
, <Global>
The TLSVerifyServer
directive configures how mod_tls
handles certificates presented by other servers, during a secure
site-to-site (a.k.a. "secure FXP") transfer. 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
server's certificate and, furthermore, will fail all SSL handshake attempts
unless the server presents a valid certificate.
The NoReverseDNS parameter tells mod_tls
to validate
the server's certificate, but to only validate it based on IP address,
rather than using DNS names (for e.g. CommonName (CN) and DNS
SubjectAltName (SAN) checks). The recommended certificate validation
techniques use DNS names, so using NoReverseDNS performs less
strict validations. Unfortunately, in most secure site-to-site transfers,
this setting may be required since FTP site-to-site transfers send IP
addresses, not DNS names, in the command which establish the data transfer.
See also: TLSVerifyClient
,
TLSVerifyDepth
tls sesscache clear
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
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
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
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.
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 installAlternatively,
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: 2013-12-09 23:15:16 $
© Copyright 2002-2013 TJ Saunders
All Rights Reserved