From 1c99850de6aed5a63e67b0b7e8f6abd64acc3f65 Mon Sep 17 00:00:00 2001 From: Yann Ylavic Date: Mon, 11 May 2015 09:32:13 +0000 Subject: [PATCH] Merge r1650310, r1650320 from trunk. Add SSLSessionTickets (on|off). It controls the use of TLS session tickets (RFC 5077). Default is unchanged (on). Using session tickets without restarting the web server with an appropriate frequency (e.g. daily) compromises perfect forward secrecy. As long as we do not have a nice key management there should be a way to deactivate session tickets. Fix copy and paste error in docs of new feature. Committed by: rjung Reviewed by: ylavic, rjung, gsmith Backported by: ylavic git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@1678703 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 9 +++++++++ STATUS | 14 -------------- docs/manual/mod/mod_ssl.xml | 20 ++++++++++++++++++++ modules/ssl/mod_ssl.c | 3 +++ modules/ssl/ssl_engine_config.c | 13 +++++++++++++ modules/ssl/ssl_engine_init.c | 10 ++++++++++ modules/ssl/ssl_private.h | 2 ++ 7 files changed, 57 insertions(+), 14 deletions(-) diff --git a/CHANGES b/CHANGES index b6afe5920a0..bfacf3e7a71 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,15 @@ -*- coding: utf-8 -*- Changes with Apache 2.2.30 + *) mod_ssl: New directive SSLSessionTickets (On|Off). + The directive controls the use of TLS session tickets (RFC 5077), + default value is "On" (unchanged behavior). + Session ticket creation uses a random key created during web + server startup and recreated during restarts. No other key + recreation mechanism is available currently. Therefore using session + tickets without restarting the web server with an appropriate frequency + (e.g. daily) compromises perfect forward secrecy. [Rainer Jung] + *) mod_deflate: Define APR_INT32_MAX when it is missing so to be able to compile against APR-1.2.x (minimum required version). [Yann Ylavic] diff --git a/STATUS b/STATUS index 2b5dcb243d2..03910f2936c 100644 --- a/STATUS +++ b/STATUS @@ -101,20 +101,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - * mod_ssl: Add SSLSessionTickets (on|off). [Rainer Jung] - It controls the use of TLS session tickets (RFC 5077). - Default is unchanged (on). - Using session tickets without restarting the web server with - an appropriate frequency (e.g. daily) compromises perfect forward - secrecy. As long as we do not have a nice key management - there needs to be a way to deactivate the use of session tickets. - trunk patch: http://svn.apache.org/r1650310 - http://svn.apache.org/r1650320 - 2.2.x patch: http://people.apache.org/~ylavic/httpd-2.2.x-SSLSessionTickets-v2.patch - +1: ylavic, rjung, gsmith - rjung: Adjust compatibility note in docs. - ylavic: Done, thanks. - * mod_log_config: Add new format flag for requestion duration in milliseconds trunk patch: http://svn.apache.org/r1675533 2.2.x patch: https://people.apache.org/~breser/httpd/2.2.x/patches/httpd-2.2.x-req_duration_milliseconds.patch (modulo CHANGES) diff --git a/docs/manual/mod/mod_ssl.xml b/docs/manual/mod/mod_ssl.xml index c9c795eabed..4e2914a40ce 100644 --- a/docs/manual/mod/mod_ssl.xml +++ b/docs/manual/mod/mod_ssl.xml @@ -1926,5 +1926,25 @@ CRIME attack).

+ +SSLSessionTickets +Enable or disable use of TLS session tickets +SSLSessionTickets on|off +SSLSessionTickets on +server config +virtual host +Available in httpd 2.2.30 and later, if using OpenSSL 0.9.8f +or later. + + +

This directive allows to enable or disable the use of TLS session tickets +(RFC 5077).

+ +

TLS session tickets are enabled by default. Using them without restarting +the web server with an appropriate frequency (e.g. daily) compromises perfect +forward secrecy.

+
+
+
diff --git a/modules/ssl/mod_ssl.c b/modules/ssl/mod_ssl.c index 19794f07de4..df0f2dc9741 100644 --- a/modules/ssl/mod_ssl.c +++ b/modules/ssl/mod_ssl.c @@ -159,6 +159,9 @@ static const command_rec ssl_config_cmds[] = { SSL_CMD_SRV(Compression, FLAG, "Enable SSL level compression" "(`on', `off')") + SSL_CMD_SRV(SessionTickets, FLAG, + "Enable or disable TLS session tickets" + "(`on', `off')") SSL_CMD_SRV(InsecureRenegotiation, FLAG, "Enable support for insecure renegotiation") SSL_CMD_ALL(UserName, TAKE1, diff --git a/modules/ssl/ssl_engine_config.c b/modules/ssl/ssl_engine_config.c index 1c9953ff576..9b0d1992bad 100644 --- a/modules/ssl/ssl_engine_config.c +++ b/modules/ssl/ssl_engine_config.c @@ -183,6 +183,7 @@ static SSLSrvConfigRec *ssl_config_server_new(apr_pool_t *p) #ifndef OPENSSL_NO_COMP sc->compression = UNSET; #endif + sc->session_tickets = UNSET; modssl_ctx_init_proxy(sc, p); @@ -284,6 +285,7 @@ void *ssl_config_server_merge(apr_pool_t *p, void *basev, void *addv) #ifndef OPENSSL_NO_COMP cfgMergeBool(compression); #endif + cfgMergeBool(session_tickets); modssl_ctx_cfg_merge_proxy(base->proxy, add->proxy, mrg->proxy); @@ -745,6 +747,17 @@ const char *ssl_cmd_SSLHonorCipherOrder(cmd_parms *cmd, void *dcfg, int flag) #endif } +const char *ssl_cmd_SSLSessionTickets(cmd_parms *cmd, void *dcfg, int flag) +{ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); +#ifndef SSL_OP_NO_TICKET + return "This version of OpenSSL does not support using " + "SSLSessionTickets."; +#endif + sc->session_tickets = flag ? TRUE : FALSE; + return NULL; +} + const char *ssl_cmd_SSLInsecureRenegotiation(cmd_parms *cmd, void *dcfg, int flag) { #ifdef SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION diff --git a/modules/ssl/ssl_engine_init.c b/modules/ssl/ssl_engine_init.c index 2c7b90072fe..6e552bb8bc1 100644 --- a/modules/ssl/ssl_engine_init.c +++ b/modules/ssl/ssl_engine_init.c @@ -595,6 +595,16 @@ static void ssl_init_ctx_protocol(server_rec *s, } #endif +#ifdef SSL_OP_NO_TICKET + /* + * Configure using RFC 5077 TLS session tickets + * for session resumption. + */ + if (sc->session_tickets == FALSE) { + SSL_CTX_set_options(ctx, SSL_OP_NO_TICKET); + } +#endif + #ifdef SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION if (sc->insecure_reneg == TRUE) { SSL_CTX_set_options(ctx, SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION); diff --git a/modules/ssl/ssl_private.h b/modules/ssl/ssl_private.h index 79d222e8b9b..d2d82d4f1e5 100644 --- a/modules/ssl/ssl_private.h +++ b/modules/ssl/ssl_private.h @@ -531,6 +531,7 @@ struct SSLSrvConfigRec { #ifndef OPENSSL_NO_COMP BOOL compression; #endif + BOOL session_tickets; }; /** @@ -588,6 +589,7 @@ const char *ssl_cmd_SSLCARevocationPath(cmd_parms *, void *, const char *); const char *ssl_cmd_SSLCARevocationFile(cmd_parms *, void *, const char *); const char *ssl_cmd_SSLHonorCipherOrder(cmd_parms *cmd, void *dcfg, int flag); const char *ssl_cmd_SSLCompression(cmd_parms *, void *, int flag); +const char *ssl_cmd_SSLSessionTickets(cmd_parms *, void *, int flag); const char *ssl_cmd_SSLVerifyClient(cmd_parms *, void *, const char *); const char *ssl_cmd_SSLVerifyDepth(cmd_parms *, void *, const char *); const char *ssl_cmd_SSLSessionCache(cmd_parms *, void *, const char *); -- 2.47.2