Should be fixed with r1822872. Sorry it took so long.
> Am 22.01.2018 um 18:50 schrieb Gregg Smith <g...@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 <g...@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, ic...@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
>>>> #...
>>>> </VirtualHost>
>>>> </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
>>>> +<VirtualHost *:443>
>>>> +#...
>>>> +</VirtualHost>
>>>> +</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 */
>>>> /** @} */
>>>>
>>>