+ mod_gnutls
uses the "configure/make/make install
"
+ mechanism common to many Open Source programs.
+ Most of the dirty work is handled by either configure or
+ Apache's apxs utility. If you have built Apache modules before, there
+ shouldn't be any surprises for you.
+
+ The interesting options you can pass to configure are:
+--with-apxs=/path/to/apache/dir/bin/apxs
+ + This option is used to specify the location of the + apxs utility that was installed as part of apache. + Specify the location of the binary, not the directory + it is located in. +
+--with-libgnutls=PATH
+ Full path to the libgnutls-config
program.
--with-apr-memcache=PREFIX
+ Prefix to where apr_memcache
is installed.
--help
+ Provides a list of available configure options.
+./configure --with-apxs=/usr/sbin/apxs2 --with-libgnutls=/usr +make +make install ++
To activate mod_gnutls
Just add
+ LoadModule gnutls_module modules/mod_gnutls.so
+ to your httpd.conf
and restart Apache.
+
Some example configuration and the exported variables to scripts can be + found in the following sections:
+ +mod_gnutls
has the following directives:
The following is an example of standard SSL Hosting, using one IP Addresses for each virtual host:
++# Load the module into Apache. +LoadModule gnutls_module modules/mod_gnutls.so + +GnuTLSCache dbm /var/cache/www-tls-cache +GnuTLSCacheTimeout 500 + +# With normal SSL Websites, you need one IP Address per-site. +Listen 1.2.3.1:443 +Listen 1.2.3.2:443 +Listen 1.2.3.3:443 +Listen 1.2.3.4:443 + +<VirtualHost 1.2.3.1:443> + GnuTLSEnable on + GnuTLSPriorities NONE:+AES-128-CBC:+3DES-CBC:+ARCFOUR-128:+RSA:+DHE-RSA:+DHE-DSS:+SHA1:+MD5:+COMP-NULL + DocumentRoot /www/site1.example.com/html + ServerName site1.example.com:443 + GnuTLSCertificateFile conf/ssl/site1.crt + GnuTLSKeyFile conf/ss/site1.key +</VirtualHost> +<VirtualHost 1.2.3.2:443> +# This virtual host enables SRP authentication + GnuTLSEnable on + GnuTLSPriorities NORMAL:+SRP + DocumentRoot /www/site2.example.com/html + ServerName site2.example.com:443 + GnuTLSSRPPasswdFile conf/ssl/tpasswd.site2 + GnuTLSSRPPasswdConfFile conf/ssl/tpasswd.site2.conf +</VirtualHost> +<VirtualHost 1.2.3.3:443> +# This server enables SRP, OpenPGP and X.509 authentication. + GnuTLSEnable on + GnuTLSPriorities NORMAL:+SRP:+SRP-RSA:+SRP-DSS + DocumentRoot /www/site3.example.com/html + ServerName site3.example.com:443 + GnuTLSCertificateFile conf/ssl/site3.crt + GnuTLSKeyFile conf/ss/site3.key + GnuTLSClientVerify ignore + GnuTLSPGPCertificateFile conf/ss/site3.pub.asc + GnuTLSPGPKeyFile conf/ss/site3.sec.asc + GnuTLSSRPPasswdFile conf/ssl/tpasswd.site3 + GnuTLSSRPPasswdConfFile conf/ssl/tpasswd.site3.conf +</VirtualHost> +<VirtualHost 1.2.3.4:443> + GnuTLSEnable on +# %COMPAT disables some security features to enable maximum compatibility with clients. + GnuTLSPriorities NONE:+AES-128-CBC:+ARCFOUR-128:+RSA:+SHA1:+MD5:+COMP-NULL:%COMPAT + DocumentRoot /www/site4.example.com/html + ServerName site4.example.com:443 + GnuTLSCertificateFile conf/ssl/site4.crt + GnuTLSKeyFile conf/ss/site4.key +</VirtualHost> ++
mod_gnutls
can also use 'Server Name Indication', as specified in
+RFC 3546. This allows hosting many SSL Websites, with a Single IP Address. Currently all the recent
+browsers support this standard. Here is an example, using SNI:
+
+# Load the module into Apache. +LoadModule gnutls_module modules/mod_gnutls.so + +# With normal SSL Websites, you need one IP Address per-site. +Listen 1.2.3.1:443 +# This could also be 'Listen *:443', +# just like '*:80' is common for non-https + +# No caching. Enable session tickets. Timeout is still used for +# ticket expiration. +GnuTLSCacheTimeout 600 + +# This tells apache, that for this IP/Port combination, we want to use +# Name Based Virtual Hosting. In the case of Server Name Indication, +# it lets mod_gnutls pick the correct Server Certificate. +NameVirtualHost 1.2.3.1:443 + +<VirtualHost 1.2.3.1:443> + GnuTLSEnable on + GnuTLSSessionTickets on + GnuTLSPriorities NORMAL + DocumentRoot /www/site1.example.com/html + ServerName site1.example.com:443 + GnuTLSCertificateFile conf/ssl/site1.crt + GnuTLSKeyFile conf/ss/site1.key +</VirtualHost> +<VirtualHost 1.2.3.1:443> + GnuTLSEnable on + GnuTLSPriorities NORMAL + DocumentRoot /www/site2.example.com/html + ServerName site2.example.com:443 + GnuTLSCertificateFile conf/ssl/site2.crt + GnuTLSKeyFile conf/ss/site2.key +</VirtualHost> +<VirtualHost 1.2.3.1:443> + GnuTLSEnable on + GnuTLSPriorities NORMAL + DocumentRoot /www/site3.example.com/html + ServerName site3.example.com:443 + GnuTLSCertificateFile conf/ssl/site3.crt + GnuTLSKeyFile conf/ss/site3.key +</VirtualHost> +<VirtualHost 1.2.3.1:443> + GnuTLSEnable on + GnuTLSPriorities NORMAL + DocumentRoot /www/site4.example.com/html + ServerName site4.example.com:443 + GnuTLSCertificateFile conf/ssl/site4.crt + GnuTLSKeyFile conf/ss/site4.key +</VirtualHost> ++
mod_gnutls
by default uses conservative settings for the
+ server. You can fine tune the configuration to reduce the load on a busy
+ server. The following examples do exactly this.
+
+# Load the module into Apache. +LoadModule gnutls_module modules/mod_gnutls.so + +# Using 4 memcache servers to distribute the SSL Session Cache. +GnuTLSCache memcache "mc1.example.com mc2.example.com mc3.example.com mc4.example.com" +GnuTLSCacheTimeout 600 + +Listen 1.2.3.1:443 +NameVirtualHost 1.2.3.1:443 + +<VirtualHost 1.2.3.1:443> + GnuTLSEnable on +# Here we disable the Perfect forward secrecy ciphersuites (DHE) +# and disallow AES-256 since AES-128 is just fine. + GnuTLSPriorities NORMAL:!DHE-RSA:!DHE-DSS:!AES-256-CBC:%COMPAT + DocumentRoot /www/site1.example.com/html + ServerName site1.example.com:443 + GnuTLSCertificateFile conf/ssl/site1.crt + GnuTLSKeyFile conf/ss/site1.key +</VirtualHost> +<VirtualHost 1.2.3.1:443> + GnuTLSEnable on +# Here we instead of disabling the DHE ciphersuites we use +# Diffie Hellman parameters of smaller size than the default (2048 bits). +# Using small numbers from 768 to 1024 bits should be ok once they are +# regenerated every few hours. +# Use "certtool --generate-dh-params --bits 1024" to get those + GnuTLSDHFile /etc/apache2/dh.params + GnuTLSPriorities NORMAL:!AES-256-CBC:%COMPAT + DocumentRoot /www/site2.example.com/html + ServerName site2.example.com:443 + GnuTLSCertificateFile conf/ssl/site2.crt + GnuTLSKeyFile conf/ss/site2.key +</VirtualHost> ++
mod_gnutls
exports the following environment variables to
+ scripts.
+
HTTPS: | can be "on" or "off" |
---|---|
SSL_VERSION_LIBRARY: | The version of the gnutls library |
SSL_VERSION_INTERFACE: | The version of this module |
SSL_PROTOCOL: | The SSL or TLS protocol name (such as "TLS 1.0" etc.) |
SSL_CIPHER: | The SSL or TLS cipher suite name. |
SSL_COMPRESS_METHOD: | The negotiated compression method (NULL or DEFLATE) |
SSL_SRP_USER: | The SRP username used for authentication. |
SSL_CIPHER_USEKEYSIZE and SSL_CIPHER_ALGKEYSIZE: | The number if bits used in the used cipher + algorithm. This does not fully reflect the security level since the size of + RSA or DHE key exchange parameters affect the security level too. |
SSL_CIPHER_EXPORT: | true or false. Whether the cipher suite negotiated is an export one. |
SSL_SESSION_ID: | The session ID negotiated in this session. Can be the same during + client reloads. |
SSL_CLIENT_V_REMAIN: | The number of days until the client's certificate is expired. |
SSL_CLIENT_V_START: | The activation time of client's certificate. |
SSL_CLIENT_V_END: | The expiration time of client's certificate. |
SSL_CLIENT_S_DN: | The distinguished name of client's certificate in RFC2253 format. |
SSL_CLIENT_I_DN: | The distinguished name of client's issuer certificate in RFC2253 format. |
SSL_CLIENT_S_AN%: | These will contain the alternative names of the client certificate + (% is a number starting from zero). The values will be prepended by "DNSNAME:", + "RFC822NAME:" or "URI:" depending on the type. If it is not supported the value + "UNSUPPORTED" will be set. |
SSL_CLIENT_M_SERIAL: | The serial number of the client's certificate. |
SSL_CLIENT_M_VERSION: | The version of the client's certificate. |
SSL_CLIENT_A_SIG: | The algorithm used for the signature in client's certificate. |
SSL_CLIENT_A_KEY: | The public key algorithm in client's certificate. |
SSL_CLIENT_CERT: | The PEM-encoded client certificate |
SSL_CLIENT_VERIFY: | whether the client's certificate was verified. (NONE if none was sent, or SUCCESS or FAILED) |
SSL_CLIENT_CERT_TYPE: | The certificate type can be X.509 or OPENPGP. |
SSL_SERVER_V_START: | The activation time of server's certificate. |
SSL_SERVER_V_END: | The expiration time of server's certificate. |
SSL_SERVER_S_DN: | The distinguished name of the server's certificate in RFC2253 format. |
SSL_SERVER_I_DN: | The distinguished name of the server's issuer certificate in RFC2253 format. |
SSL_SERVER_S_AN%: | These will contain the alternative names of the server certificate + (% is a number starting from zero). The values will be prepended by "DNSNAME:", + "RFC822NAME:" or "URI:" depending on the type. If it is not supported the value + "UNSUPPORTED" will be set. |
SSL_SERVER_M_SERIAL: | The serial number of the server's certificate. |
SSL_SERVER_M_VERSION: | The version of the server's certificate. |
SSL_SERVER_A_SIG: | The algorithm used for the signature in server's certificate. |
SSL_SERVER_A_KEY: | The public key algorithm in server's certificate. |
SSL_SERVER_CERT: | The PEM-encoded server certificate |
SSL_SERVER_CERT_TYPE: | The certificate type can be X.509 or +OPENPGP. |
Description: | +Configure SSL Session Cache | +
---|---|
Syntax: | +GnuTLSCache [dbm|gdbm|memcache|none] [path|server list|-] |
+
Default: | +dbm "conf/gnutls_cache" |
+
Context: | ++ global config + | +
This directive configures the SSL Session Cache for mod_gnutls
.
+ This could be shared between machines of different architectures.
+
mod_gnutls
+ since even followup connections by a client must renegotiate
+ parameters instead of reusing old ones.
+ GnuTLSCache memcache "10.0.0.1 10.0.0.2 10.0.0.3"+
Description: | +Timeout for SSL Session Cache expiration. | +
---|---|
Syntax: | +GnuTLSCacheTimeout seconds |
+
Default: | +300 |
+
Context: | ++ global config + | +
+ Sets the timeout for SSL Session Cache entries expiration. This directive + is valid even if Session Tickets are used, and indicates the + expiration time of the ticket. +
+Description: | +Enable Session Tickets for the server. | +
---|---|
Syntax: | +GnuTLSSessionTickets [on|off] |
+
Default: | +off |
+
Context: | ++ server config, + virtual host. + | +
+ To avoid storing data for TLS session resumption it is allowed + to provide client with a ticket, to use on return. Use for servers + with limited storage, and don't combine with GnuTLSCache. For a pool + of servers this option is not recommended since the tickets are + unique for the issuing server only. +
+Description: | +Set to the PEM Encoded Server Certificate. | +
---|---|
Syntax: | +GnuTLSCertificateFile file-path |
+
Default: | +none |
+
Context: | ++ server config, + virtual host. + | +
Takes an absolute or relative path to a PEM Encoded Certificate to use as this Server's + Certificate. +
+Example Usage: +GnuTLSCertificateFile conf/ssl/server.crt+
Description: | +Set to a base64 Encoded Server OpenPGP Certificate. | +
---|---|
Syntax: | +GnuTLSPGPCertificateFile file-path |
+
Default: | +none |
+
Context: | ++ server config, + virtual host. + | +
Takes an absolute or relative path to a base64 Encoded OpenPGP Certificate to use as this Server's + Certificate. +
+Example Usage: +GnuTLSPGPCertificateFile conf/ssl/server.asc+
Description: | +Enable Client Certificate Verification | +
---|---|
Syntax: | +GnuTLSClientVerify [ignore|request|require| |
+
Default: | +ignore |
+
Context: | ++ server config, + virtual host, + directory, + .htaccess + | +
This directive controls the use of SSL Client Certificate Authentication. If used in the .htaccess
+ context, it can force TLS re-negotiation.
+
mod_gnutls
will ignore the contents of any SSL Client Certificates sent.
+ It will not request that the client sends a certificate.
+ SSL_CLIENT_VERIFY
environment variable and can be "SUCCESS", "FAILED" or "NONE".SSL_CLIENT_VERIFY
environment variable will only be set to "SUCCESS".<Directory "/path/to/my/docroot"> + GnuTLSClientVerify require +</Directory>+
Description: | +Set to the PEM Encoded Certificate Authority Certificate. | +
---|---|
Syntax: | +GnuTLSClientCAFile file-path |
+
Default: | +none |
+
Context: | ++ server config, + virtual host. + | +
Takes an absolute or relative path to a PEM Encoded Certificate to use as a Certificate Authority with Client Certificate Authentication. This file may contain a list of trusted authorities. +
+Example Usage: +GnuTLSClientCAFile conf/ssl/ca.crt+
Description: | +Set to a base64 Encoded key ring. | +
---|---|
Syntax: | +GnuTLSPGPKeyringFile file-path |
+
Default: | +none |
+
Context: | ++ server config, + virtual host. + | +
Takes an absolute or relative path to a base64 Encoded Certificate + list (key ring) to use as a means of verification of Client + Certificates. This file should contain a list of trusted signers. +
+Example Usage: +GnuTLSPGPKeyringFile conf/ssl/ring.asc+
Description: | +Enable GnuTLS for this virtual host. | +
---|---|
Syntax: | +GnuTLSEnable [on|off] |
+
Default: | +off |
+
Context: | ++ virtual host + | +
This directive enables SSL/TLS Encryption for a Virtual Host. +
+<VirtualHost 1.2.3.4:443> + GnuTLSEnable on + # other directives for the Virtual Host. +</VirtualHost>+
Description: | +Export the PEM encoded certificates to CGIs. | +
---|---|
Syntax: | +GnuTLSExportCertificates [on|off] |
+
Default: | +off |
+
Context: | ++ virtual host + | +
This directive enables exporting the full PEM encoded certificates of
+ the server and the client to CGIs. This makes mod_gnutls
export exactly the same environment variables as mod_ssl
.
+
<VirtualHost 1.2.3.4:443> + GnuTLSExportCertificates on + # other directives for the Virtual Host. +</VirtualHost>+
Description: | +Set to the Server Private Key. | +
---|---|
Syntax: | +GnuTLSKeyFile file-path |
+
Default: | +none |
+
Context: | ++ server config, + virtual host. + | +
Takes an absolute or relative path to the Server Private Key. This key cannot currently be password protected. +
+Example Usage: +GnuTLSKeyFile conf/ssl/server.key+
nobody
or apache
user.
+ Description: | +Set to the Server OpenPGP Secret Key. | +
---|---|
Syntax: | +GnuTLSPGPKeyFile file-path |
+
Default: | +none |
+
Context: | ++ server config, + virtual host. + | +
Takes an absolute or relative path to the Server Private Key. This key cannot currently be password protected. +
+Example Usage: +GnuTLSPGPKeyFile conf/ssl/server.asc+
nobody
or apache
user.
+ Description: | +Set to the PKCS #3 encoded Diffie Hellman parameters. | +
---|---|
Syntax: | +GnuTLSDHFile file-path |
+
Default: | +none |
+
Context: | ++ server config, + virtual host. + | +
Takes an absolute or relative path to a PKCS #3 encoded DH parameters. Those are used when the DHE key exchange method is enabled. You can generate this file using
+ "certtool --generate-dh-params --bits 2048". If not set mod_gnutls
will use the included parameters.
+
GnuTLSDHFile conf/ssl/dhparams+
Description: | +Set to the PKCS #1 encoded RSA parameters for 'EXPORT' ciphersuites. | +
---|---|
Syntax: | +GnuTLSRSAFile file-path |
+
Default: | +none |
+
Context: | ++ server config, + virtual host. + | +
Takes an absolute or relative path to a PKCS #1 encoded RSA parameters. Those are used when the RSA-EXPORT key exchange method is enabled. You can generate this file using "certtool --generate-privkey --bits 512". These parameters should not contain key of longer of 512 bits (due to the export restrictions). If not set mod_gnutls
will not negotiate the 'EXPORT' ciphersuites. It is recommended not to enable those ciphersuites. If you do make sure you regenerate this file at every few hours.
+
GnuTLSRSAFile conf/ssl/rsaparams+
Description: | +Set to the SRP password file for SRP ciphersuites. | +
---|---|
Syntax: | +GnuTLSSRPPasswdFile file-path |
+
Default: | +none |
+
Context: | ++ server config, + virtual host. + | +
Takes an absolute or relative path to an SRP password file. This is the same format as used in libsrp. You can generate such file using the command "srptool --passwd /etc/tpasswd --passwd-conf /etc/tpasswd.conf -u test" to set a password for user test. This password file holds the username, a password verifier and the dependency to the SRP parameters. +
+Example Usage: +GnuTLSSRPPasswdFile conf/ssl/tpasswd+
Description: | +Set to the SRP password.conf file for SRP ciphersuites. | +
---|---|
Syntax: | +GnuTLSSRPPasswdConfFile file-path |
+
Default: | +none |
+
Context: | ++ server config, + virtual host. + | +
Takes an absolute or relative path to an SRP password.conf file. This is the same format as used in libsrp. You can generate such file using the command "srptool --create-conf /etc/tpasswd.conf". This file holds the SRP parameters and is associate with the password file (the verifiers depends on these parameters). +
+Example Usage: +GnuTLSSRPPasswdConfFile conf/ssl/tpasswd.conf+
Description: | +Set the allowed ciphers, key exchange algorithms, MACs and + compression methods. | +
---|---|
Syntax: | +GnuTLSPriorities +cipher0:+cipher1:...:+cipherN |
+
Default: | +none |
+
Context: | ++ server config, + virtual host. + | +
Takes a semi-colon separated list of ciphers, key exchange methods
+ Message authentication codes and compression methods to enable. The
+ allowed keywords are specified in the gnutls_priority_init()
+ function of GnuTLS
. It's documentation can be found at
+ Core
+ GnuTLS functions.
+
+ In brief you can specify a set of ciphersuites from the choices: +
NORMAL:!ARCFOUR-128
. Other options such as the protocol
+ version and the compression method can be specified using the
+ VERS-
and COMP-
prefixes. So in order to
+ remove or add a specific TLS version from the "NORMAL" set use
+ NORMAL:!VERS-SSL3.0
. To enable
+ zlib compression use NORMAL:+COMP-DEFLATE
.
+ However it is recommended not to add compression at this level.
+ With the "NONE" set, in order to be usable, you have to specify a complete
+ set of combinations of protocol versions, cipher algorithms
+ (AES-128-CBC), key exchange algorithms (RSA), message authentication
+ codes (SHA1) and compression methods (COMP-NULL).
+ + All the supported algorithms are: +
The special keyword "%COMPAT" will disable some security features + such as protection against statistical attacks to ciphertext data in + order to achieve maximum compatibility (some broken mobile clients need + this). +
+Example Usage: +GnuTLSPriorities NORMAL:!AES-256-CBC:!DHE-RSA+
GnuTLSPriorities EXPORT:!VERS-TLS1.0:+COMP-DEFLATE:+CTYPE-OPENPGP+
GnuTLSPriorities NONE:+VERS-TLS1.0:+AES-128-CBC:+RSA:+SHA1:+COMP-NULL+
GnuTLSPriorities NORMAL:+COMP-DEFLATE+
GnuTLSPriorities NORMAL:%COMPAT+
GnuTLSPriorities NORMAL:+ANON-DH+
+ Lines of code in mod_gnutls: 4,081
+ Lines of code in mod_ssl: 15,324
+Server name indication is a way for HTTP TLS clients to indicate the name of +the server they are connecting to. This allows multiple TLS virtual hosts on a +single IP. The protocol is described in RFC 3546.
++ + +
+