You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@httpd.apache.org by Stefan Eissing <st...@greenbytes.de> on 2018/02/01 12:38:19 UTC

Re: svn commit: r1807709 - in /httpd/httpd/trunk: CHANGES docs/manual/mod/mod_ssl.xml modules/ssl/mod_ssl.c modules/ssl/ssl_engine_config.c modules/ssl/ssl_engine_init.c modules/ssl/ssl_private.h

Should be fixed with r1822872. Sorry it took so long.

> Am 22.01.2018 um 18:50 schrieb Gregg Smith <gl...@gknw.net>:
> 
> Stefan,
> 
> Yes, that and vhost.c would.
> 
> 
> Gregg
> 
> On 1/22/2018 12:29 AM, Stefan Eissing wrote:
>> Gregg,
>> that'd mean we need an AP_DECLARE on that in http_vhost.h? Would that suffice?
>> Cheers, Stefan
>>> Am 20.01.2018 um 03:50 schrieb Gregg Smith <gl...@gknw.net>:
>>> 
>>> Hi Stefan,
>>> 
>>> Specific to ssl_engine_config.c, on Win32 we need to have ap_parse_vhost_addrs() exported from vhost.c.
>>> 
>>> Cheers,
>>> 
>>> G
>>> 
>>> On 9/8/2017 3:29 AM, icing@apache.org wrote:
>>>> Author: icing
>>>> Date: Fri Sep  8 10:29:53 2017
>>>> New Revision: 1807709
>>>> 
>>>> URL: http://svn.apache.org/viewvc?rev=1807709&view=rev
>>>> Log:
>>>> On the trunk:
>>>> 
>>>> mod_ssl: Extending SSLEngine to alternatively get a list of add:port spec as used in VirtualHost.
>>>> 
>>>> 
>>>> Modified:
>>>>     httpd/httpd/trunk/CHANGES
>>>>     httpd/httpd/trunk/docs/manual/mod/mod_ssl.xml
>>>>     httpd/httpd/trunk/modules/ssl/mod_ssl.c
>>>>     httpd/httpd/trunk/modules/ssl/ssl_engine_config.c
>>>>     httpd/httpd/trunk/modules/ssl/ssl_engine_init.c
>>>>     httpd/httpd/trunk/modules/ssl/ssl_private.h
>>>> 
>>>> Modified: httpd/httpd/trunk/CHANGES
>>>> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/CHANGES?rev=1807709&r1=1807708&r2=1807709&view=diff
>>>> ==============================================================================
>>>> --- httpd/httpd/trunk/CHANGES [utf-8] (original)
>>>> +++ httpd/httpd/trunk/CHANGES [utf-8] Fri Sep  8 10:29:53 2017
>>>> @@ -1,6 +1,9 @@
>>>>                                                           -*- coding: utf-8 -*-
>>>>  Changes with Apache 2.5.0
>>>>  +  *) mod_ssl: Adding option to set a list of addr:port specs, as used in VirtualHosts
>>>> +     to enable SSLEngine for all matching hosts. Updated documentation. [Stefan Eissing]
>>>> +
>>>>    *) core: Disallow Methods' registration at runtime (.htaccess), they may be
>>>>       used only if registered at init time (httpd.conf).  [Yann Ylavic]
>>>>  Modified: httpd/httpd/trunk/docs/manual/mod/mod_ssl.xml
>>>> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/docs/manual/mod/mod_ssl.xml?rev=1807709&r1=1807708&r2=1807709&view=diff
>>>> ==============================================================================
>>>> --- httpd/httpd/trunk/docs/manual/mod/mod_ssl.xml (original)
>>>> +++ httpd/httpd/trunk/docs/manual/mod/mod_ssl.xml Fri Sep  8 10:29:53 2017
>>>> @@ -550,15 +550,15 @@ SSLSessionCacheTimeout 600
>>>>  <directivesynopsis>
>>>>  <name>SSLEngine</name>
>>>>  <description>SSL Engine Operation Switch</description>
>>>> -<syntax>SSLEngine on|off|optional</syntax>
>>>> +<syntax>SSLEngine on|off|optional|addr[:port] [addr[:port]] ...</syntax>
>>>>  <default>SSLEngine off</default>
>>>>  <contextlist><context>server config</context>
>>>>  <context>virtual host</context></contextlist>
>>>>    <usage>
>>>>  <p>
>>>> -This directive toggles the usage of the SSL/TLS Protocol Engine. This
>>>> -is should be used inside a <directive module="core"
>>>> +This directive toggles the usage of the SSL/TLS Protocol Engine. Values 'on',
>>>> +'off' and 'optional' should be used inside a <directive module="core"
>>>>  type="section">VirtualHost</directive> section to enable SSL/TLS for a
>>>>  that virtual host. By default the SSL/TLS Protocol Engine is
>>>>  disabled for both the main server and all configured virtual hosts.</p>
>>>> @@ -569,6 +569,18 @@ SSLEngine on
>>>>  #...
>>>>  &lt;/VirtualHost&gt;
>>>>  </highlight>
>>>> +</example>
>>>> +<p>In Apache 2.4 and later, addr:port values should be used in the
>>>> +global server to enable the SSL/TLS Protocol Engine for <em>all</em>
>>>> +<directive module="core" type="section">VirtualHost</directive>s
>>>> +that match one of the addresses in the list.</p>
>>>> +<example><title>Example</title>
>>>> +<highlight language="config">
>>>> +SSLEngine *:443
>>>> +&lt;VirtualHost *:443&gt;
>>>> +#...
>>>> +&lt;/VirtualHost&gt;
>>>> +</highlight>
>>>>  </example>
>>>>  <p>In Apache 2.1 and later, <directive>SSLEngine</directive> can be set to
>>>>  <code>optional</code>. This enables support for
>>>> 
>>>> Modified: httpd/httpd/trunk/modules/ssl/mod_ssl.c
>>>> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/ssl/mod_ssl.c?rev=1807709&r1=1807708&r2=1807709&view=diff
>>>> ==============================================================================
>>>> --- httpd/httpd/trunk/modules/ssl/mod_ssl.c (original)
>>>> +++ httpd/httpd/trunk/modules/ssl/mod_ssl.c Fri Sep  8 10:29:53 2017
>>>> @@ -91,7 +91,7 @@ static const command_rec ssl_config_cmds
>>>>      /*
>>>>       * Per-server context configuration directives
>>>>       */
>>>> -    SSL_CMD_SRV(Engine, TAKE1,
>>>> +    SSL_CMD_SRV(Engine, RAW_ARGS,
>>>>                  "SSL switch for the protocol engine "
>>>>                  "('on', 'off')")
>>>>      SSL_CMD_SRV(FIPS, FLAG,
>>>> @@ -490,6 +490,75 @@ static SSLConnRec *ssl_init_connection_c
>>>>      return sslconn;
>>>>  }
>>>>  +static int ssl_server_addr_matches(server_addr_rec *sar, apr_sockaddr_t *sa)
>>>> +{
>>>> +    /* Determine if the list of server_addr_rec's matches the given socket address.
>>>> +     * IP Address/port may be wilcard/0 for a match to occur. */
>>>> +    while (sar) {
>>>> +        if (apr_sockaddr_is_wildcard(sar->host_addr)
>>>> +            || apr_sockaddr_equal(sar->host_addr, sa)) {
>>>> +            if (sar->host_addr->port == sa->port
>>>> +                || sar->host_addr->port == 0
>>>> +                || sa->port == 0) {
>>>> +                return 1;
>>>> +            }
>>>> +        }
>>>> +        sar = sar->next;
>>>> +    }
>>>> +    return 0;
>>>> +}
>>>> +
>>>> +int ssl_server_addr_overlap(server_addr_rec *sar1, server_addr_rec *sar2)
>>>> +{
>>>> +    if (sar1) {
>>>> +        while (sar2) {
>>>> +            if (ssl_server_addr_matches(sar1, sar2->host_addr)) {
>>>> +                return 1;
>>>> +            }
>>>> +            sar2 = sar2->next;
>>>> +        }
>>>> +    }
>>>> +    return 0;
>>>> +}
>>>> +
>>>> +static ssl_enabled_t ssl_srv_enabled_on(server_rec *s, apr_sockaddr_t *sa)
>>>> +{
>>>> +    SSLSrvConfigRec *sc = mySrvConfig(s);
>>>> +    if (sc->enabled == SSL_ENABLED_TRUE && sc->enabled_on) {
>>>> +        if (!ssl_server_addr_matches(sc->enabled_on, sa)) {
>>>> +            return SSL_ENABLED_FALSE;
>>>> +        }
>>>> +    }
>>>> +    return sc->enabled;
>>>> +}
>>>> +
>>>> +static ssl_enabled_t ssl_conn_enabled(conn_rec *c)
>>>> +{
>>>> +    if (c->master) {
>>>> +        return ssl_conn_enabled(c->master);
>>>> +    }
>>>> +    else {
>>>> +        SSLConnRec *sslconn = myConnConfig(c);
>>>> +        if (sslconn) {
>>>> +            if (sslconn->disabled) {
>>>> +                return SSL_ENABLED_FALSE;
>>>> +            }
>>>> +            if (sslconn->is_proxy) {
>>>> +                if (!sslconn->dc->proxy_enabled) {
>>>> +                    return SSL_ENABLED_FALSE;
>>>> +                }
>>>> +            }
>>>> +            else {
>>>> +                return ssl_srv_enabled_on(sslconn->server, c->local_addr);
>>>> +            }
>>>> +        }
>>>> +        else {
>>>> +            return ssl_srv_enabled_on(c->base_server, c->local_addr);
>>>> +        }
>>>> +    }
>>>> +    return SSL_ENABLED_TRUE;
>>>> +}
>>>> +
>>>>  static int ssl_engine_status(conn_rec *c, SSLConnRec *sslconn)
>>>>  {
>>>>      if (c->master) {
>>>> @@ -504,17 +573,13 @@ static int ssl_engine_status(conn_rec *c
>>>>                  return DECLINED;
>>>>              }
>>>>          }
>>>> -        else {
>>>> -            if (mySrvConfig(sslconn->server)->enabled != SSL_ENABLED_TRUE) {
>>>> -                return DECLINED;
>>>> -            }
>>>> -        }
>>>> -    }
>>>> -    else {
>>>> -        if (mySrvConfig(c->base_server)->enabled != SSL_ENABLED_TRUE) {
>>>> +        else if (ssl_srv_enabled_on(sslconn->server, c->local_addr) != SSL_ENABLED_TRUE) {
>>>>              return DECLINED;
>>>>          }
>>>>      }
>>>> +    else if (ssl_srv_enabled_on(c->base_server, c->local_addr) != SSL_ENABLED_TRUE) {
>>>> +        return DECLINED;
>>>> +    }
>>>>      return OK;
>>>>  }
>>>>  @@ -632,26 +697,29 @@ int ssl_init_ssl_connection(conn_rec *c,
>>>>      return APR_SUCCESS;
>>>>  }
>>>>  +/* FIXME: if we ever want to server http: requests over TLS, this
>>>> + * needs to change. We probably need the scheme in request_rec and
>>>> + * return that iff it is set. */
>>>>  static const char *ssl_hook_http_scheme(const request_rec *r)
>>>>  {
>>>> -    SSLSrvConfigRec *sc = mySrvConfig(r->server);
>>>> -
>>>> -    if (sc->enabled == SSL_ENABLED_FALSE || sc->enabled == SSL_ENABLED_OPTIONAL) {
>>>> -        return NULL;
>>>> +    switch (ssl_conn_enabled(r->connection)) {
>>>> +        case SSL_ENABLED_FALSE:
>>>> +        case SSL_ENABLED_OPTIONAL:
>>>> +            return NULL;
>>>> +        default:
>>>> +            return "https";
>>>>      }
>>>> -
>>>> -    return "https";
>>>>  }
>>>>    static apr_port_t ssl_hook_default_port(const request_rec *r)
>>>>  {
>>>> -    SSLSrvConfigRec *sc = mySrvConfig(r->server);
>>>> -
>>>> -    if (sc->enabled == SSL_ENABLED_FALSE || sc->enabled == SSL_ENABLED_OPTIONAL) {
>>>> -        return 0;
>>>> +    switch (ssl_conn_enabled(r->connection)) {
>>>> +        case SSL_ENABLED_FALSE:
>>>> +        case SSL_ENABLED_OPTIONAL:
>>>> +            return 0;
>>>> +        default:
>>>> +            return 443;
>>>>      }
>>>> -
>>>> -    return 443;
>>>>  }
>>>>    static int ssl_hook_pre_connection(conn_rec *c, void *csd)
>>>> 
>>>> Modified: httpd/httpd/trunk/modules/ssl/ssl_engine_config.c
>>>> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/ssl/ssl_engine_config.c?rev=1807709&r1=1807708&r2=1807709&view=diff
>>>> ==============================================================================
>>>> --- httpd/httpd/trunk/modules/ssl/ssl_engine_config.c (original)
>>>> +++ httpd/httpd/trunk/modules/ssl/ssl_engine_config.c Fri Sep  8 10:29:53 2017
>>>> @@ -231,6 +231,7 @@ static SSLSrvConfigRec *ssl_config_serve
>>>>      sc->session_tickets        = UNSET;
>>>>      sc->policies               = NULL;
>>>>      sc->error_policy           = NULL;
>>>> +    sc->enabled_on             = NULL;
>>>>        modssl_ctx_init_server(sc, p);
>>>>  @@ -375,6 +376,8 @@ void *ssl_config_server_merge(apr_pool_t
>>>>        mrg->policies = NULL;
>>>>      cfgMergeString(error_policy);
>>>> +
>>>> +    mrg->enabled_on = (add->enabled == SSL_ENABLED_UNSET)? base->enabled_on : add->enabled_on;
>>>>                                 modssl_ctx_cfg_merge_server(p, base->server, add->server, mrg->server);
>>>>  @@ -1010,24 +1013,54 @@ const char *ssl_cmd_SSLRandomSeed(cmd_pa
>>>>      return NULL;
>>>>  }
>>>>  -const char *ssl_cmd_SSLEngine(cmd_parms *cmd, void *dcfg, const char *arg)
>>>> +const char *ssl_cmd_SSLEngine(cmd_parms *cmd, void *dcfg, const char *args)
>>>>  {
>>>>      SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
>>>> +    const char *w, *err;
>>>> +    server_addr_rec **psar;
>>>> +    server_rec s;
>>>> +
>>>> +    w = ap_getword_conf(cmd->pool, &args);
>>>>  -    if (!strcasecmp(arg, "On")) {
>>>> -        sc->enabled = SSL_ENABLED_TRUE;
>>>> -        return NULL;
>>>> +    if (*w == '\0') {
>>>> +        return "SSLEngine takes at least one argument";
>>>>      }
>>>> -    else if (!strcasecmp(arg, "Off")) {
>>>> -        sc->enabled = SSL_ENABLED_FALSE;
>>>> -        return NULL;
>>>> +
>>>> +    if (*args == 0) {
>>>> +        if (!strcasecmp(w, "On")) {
>>>> +            sc->enabled = SSL_ENABLED_TRUE;
>>>> +            sc->enabled_on = NULL;
>>>> +            return NULL;
>>>> +        }
>>>> +        else if (!strcasecmp(w, "Off")) {
>>>> +            sc->enabled = SSL_ENABLED_FALSE;
>>>> +            sc->enabled_on = NULL;
>>>> +            return NULL;
>>>> +        }
>>>> +        else if (!strcasecmp(w, "Optional")) {
>>>> +            sc->enabled = SSL_ENABLED_OPTIONAL;
>>>> +            sc->enabled_on = NULL;
>>>> +            return NULL;
>>>> +        }
>>>>      }
>>>> -    else if (!strcasecmp(arg, "Optional")) {
>>>> -        sc->enabled = SSL_ENABLED_OPTIONAL;
>>>> -        return NULL;
>>>> +
>>>> +    memset(&s, 0, sizeof(s));
>>>> +    err = ap_parse_vhost_addrs(cmd->pool, w, &s);
>>>> +    sc->enabled_on = s.addrs;
>>>> +    sc->enabled = SSL_ENABLED_TRUE;
>>>> +
>>>> +    if (!err && *args) {
>>>> +        s.addrs = NULL;
>>>> +        err = ap_parse_vhost_addrs(cmd->pool, args, &s);
>>>> +        if (!err && s.addrs) {
>>>> +            psar = &sc->enabled_on;
>>>> +            while (*psar) {
>>>> +                psar = &(*psar)->next;
>>>> +            }
>>>> +            *psar = s.addrs;
>>>> +        }
>>>>      }
>>>> -
>>>> -    return "Argument must be On, Off, or Optional";
>>>> +    return err;
>>>>  }
>>>>    const char *ssl_cmd_SSLFIPS(cmd_parms *cmd, void *dcfg, int flag)
>>>> 
>>>> Modified: httpd/httpd/trunk/modules/ssl/ssl_engine_init.c
>>>> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/ssl/ssl_engine_init.c?rev=1807709&r1=1807708&r2=1807709&view=diff
>>>> ==============================================================================
>>>> --- httpd/httpd/trunk/modules/ssl/ssl_engine_init.c (original)
>>>> +++ httpd/httpd/trunk/modules/ssl/ssl_engine_init.c Fri Sep  8 10:29:53 2017
>>>> @@ -269,6 +269,13 @@ apr_status_t ssl_init_Module(apr_pool_t
>>>>          if (sc->enabled == SSL_ENABLED_UNSET) {
>>>>              sc->enabled = SSL_ENABLED_FALSE;
>>>>          }
>>>> +        /* Check if conditions to enable apply to this server at all. Conditions
>>>> +         * might be inherited from base server and never match a vhost. */
>>>> +        if (sc->enabled_on && sc->enabled == SSL_ENABLED_TRUE) {
>>>> +            if (!ssl_server_addr_overlap(sc->enabled_on, s->addrs)) {
>>>> +                sc->enabled = SSL_ENABLED_FALSE;
>>>> +            }
>>>> +        }
>>>>            if (sc->session_cache_timeout == UNSET) {
>>>>              sc->session_cache_timeout = SSL_SESSION_CACHE_TIMEOUT;
>>>> 
>>>> Modified: httpd/httpd/trunk/modules/ssl/ssl_private.h
>>>> URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/ssl/ssl_private.h?rev=1807709&r1=1807708&r2=1807709&view=diff
>>>> ==============================================================================
>>>> --- httpd/httpd/trunk/modules/ssl/ssl_private.h (original)
>>>> +++ httpd/httpd/trunk/modules/ssl/ssl_private.h Fri Sep  8 10:29:53 2017
>>>> @@ -740,6 +740,7 @@ struct SSLSrvConfigRec {
>>>>            apr_array_header_t *policies;      /* policy that shall be applied to this config */
>>>>      const char      *error_policy;     /* error in policy merge, bubble up */
>>>> +    server_addr_rec *enabled_on;       /* optional list of addresses where ssl is enabled */
>>>>  };
>>>>    /**
>>>> @@ -1091,6 +1092,8 @@ extern int ssl_running_on_valgrind;
>>>>  int ssl_is_challenge(conn_rec *c, const char *servername,
>>>>                       X509 **pcert, EVP_PKEY **pkey);
>>>>  +int ssl_server_addr_overlap(server_addr_rec *sar1, server_addr_rec *sar2);
>>>> +
>>>>  #endif /* SSL_PRIVATE_H */
>>>>  /** @} */
>>>>  
>>>