Apache HTTPD
mod_tls.c
Go to the documentation of this file.
1/* Licensed to the Apache Software Foundation (ASF) under one or more
2 * contributor license agreements. See the NOTICE file distributed with
3 * this work for additional information regarding copyright ownership.
4 * The ASF licenses this file to You under the Apache License, Version 2.0
5 * (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16#include <assert.h>
17#include <apr_optional.h>
18#include <apr_strings.h>
19
20#include <mpm_common.h>
21#include <httpd.h>
22#include <http_core.h>
23#include <http_connection.h>
24#include <http_log.h>
25#include <http_protocol.h>
26#include <http_ssl.h>
27#include <http_request.h>
28#include <ap_socache.h>
29
30#include <rustls.h>
31
32#include "mod_tls.h"
33#include "tls_conf.h"
34#include "tls_core.h"
35#include "tls_cache.h"
36#include "tls_proto.h"
37#include "tls_filter.h"
38#include "tls_var.h"
39#include "tls_version.h"
40
41#include "mod_proxy.h"
42
43static void tls_hooks(apr_pool_t *pool);
44
47 tls_conf_create_dir, /* create per dir config */
48 tls_conf_merge_dir, /* merge per dir config */
49 tls_conf_create_svr, /* create per server config */
50 tls_conf_merge_svr, /* merge per server config (inheritance) */
51 tls_conf_cmds, /* command handlers */
53#if defined(AP_MODULE_FLAG_NONE)
55#endif
56};
57
58static const char* crustls_version(apr_pool_t *p)
59{
60 struct rustls_str rversion;
61
63 return apr_pstrndup(p, rversion.data, rversion.len);
64}
65
67{
70 return OK;
71}
72
74 apr_pool_t *ptemp, server_rec *s)
75{
76 const char *tls_init_key = "mod_tls_init_counter";
78 void *data = NULL;
79
80 (void)plog;
82 assert(sc);
83 assert(sc->global);
84 sc->global->module_version = "mod_tls/" MOD_TLS_VERSION;
86
87 apr_pool_userdata_get(&data, tls_init_key, s->process->pool);
88 if (data == NULL) {
89 /* At the first start, httpd makes a config check dry run
90 * to see if the config is ok in principle.
91 */
92 ap_log_error(APLOG_MARK, APLOG_TRACE1, 0, s, "post config dry run");
93 apr_pool_userdata_set((const void *)1, tls_init_key,
94 apr_pool_cleanup_null, s->process->pool);
95 }
96 else {
98 "%s (%s), initializing...",
101 }
102
103 return tls_core_init(p, ptemp, s);
104}
105
114
115#if AP_MODULE_MAGIC_AT_LEAST(20120211, 109)
117{
118 /* we are not handling proxy connections - for now */
121 ap_log_error(APLOG_MARK, APLOG_TRACE2, 0, c->base_server,
122 "accepted ssl_bind_outgoing(enable=%d) for %s",
123 enable_ssl, c->base_server->server_hostname);
124 return OK;
125 }
127 ap_log_error(APLOG_MARK, APLOG_TRACE2, 0, c->base_server,
128 "declined ssl_bind_outgoing(enable=%d) for %s",
129 enable_ssl, c->base_server->server_hostname);
130 return DECLINED;
131}
132
133#else /* #if AP_MODULE_MAGIC_AT_LEAST(20120211, 109) */
134
139 int proxy, int enable));
141
142static int ssl_engine_set(
143 conn_rec *c, ap_conf_vector_t *dir_conf, int proxy, int enable)
144{
145 ap_log_error(APLOG_MARK, APLOG_TRACE3, 0, c->base_server,
146 "ssl_engine_set(proxy=%d, enable=%d) for %s",
147 proxy, enable, c->base_server->server_hostname);
149 if (enable && tls_core_setup_outgoing(c) == OK) {
151 module_ssl_engine_set(c, dir_conf, proxy, 0);
152 }
153 return 1;
154 }
155 if (proxy || !enable) {
156 /* we are not handling proxy connections - for now */
158 }
160 return module_ssl_engine_set(c, dir_conf, proxy, enable);
161 }
162 return 0;
163}
164
165static int ssl_proxy_enable(conn_rec *c)
166{
167 return ssl_engine_set(c, NULL, 1, 1);
168}
169
170static int ssl_engine_disable(conn_rec *c)
171{
172 return ssl_engine_set(c, NULL, 0, 0);
173}
174
177{
178 if (1) {
179 const char *tls_init_key = "mod_tls_proxy_ssl_counter";
180 void *data = NULL;
182
183 (void)p;
184 (void)plog;
185 (void)ptemp;
186 apr_pool_userdata_get(&data, tls_init_key, s->process->pool);
187 if (data == NULL) {
188 /* At the first start, httpd makes a config check dry run
189 * to see if the config is ok in principle.
190 */
191 apr_pool_userdata_set((const void *)1, tls_init_key,
192 apr_pool_cleanup_null, s->process->pool);
193 return APR_SUCCESS;
194 }
195
196 /* mod_ssl (if so loaded, has registered its optional functions.
197 * When mod_proxy runs in post-config, it looks up those functions and uses
198 * them to manipulate SSL status for backend connections.
199 * We provide our own implementations to avoid becoming active on such
200 * connections for now.
201 * */
208 }
209 return APR_SUCCESS;
210}
211#endif /* #if AP_MODULE_MAGIC_AT_LEAST(20120211, 109) */
212
217
219{
220 (void)csd; /* mpm specific socket data, not used */
221
222 /* are we on a primary connection? */
223 if (c->master) return DECLINED;
224
225 /* Decide connection TLS stats and install our
226 * input/output filters for handling TLS/application data
227 * if enabled.
228 */
230}
231
233{
235 /* we do *not* take over. we are not processing requests. */
236 return DECLINED;
237}
238
239static const char *tls_hook_http_scheme(const request_rec *r)
240{
241 return (tls_conn_check_ssl(r->connection) == OK)? "https" : NULL;
242}
243
245{
246 return (tls_conn_check_ssl(r->connection) == OK) ? 443 : 0;
247}
248
249static const char* const mod_http2[] = { "mod_http2.c", NULL};
250
252{
253 /* If our request check denies further processing, certain things
254 * need to be in place for the response to be correctly generated. */
255 static const char *dep_req_check[] = { "mod_setenvif.c", NULL };
256 static const char *dep_proxy[] = { "mod_proxy.c", NULL };
257
258 ap_log_perror(APLOG_MARK, APLOG_TRACE1, 0, pool, "installing hooks");
260
262 /* run post-config hooks one before, one after mod_proxy, as the
263 * mod_proxy's own one calls us in its "section_post_config" hook. */
270 /* connection things */
273 /* request things */
278
281
282#if AP_MODULE_MAGIC_AT_LEAST(20120211, 109)
284#else
286#endif
287
288}
Small object cache provider interface.
APR-UTIL registration of functions exported by modules.
APR Strings library.
void ap_hook_process_connection(ap_HOOK_process_connection_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
Definition connection.c:42
void ap_hook_pre_connection(ap_HOOK_pre_connection_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
Definition connection.c:43
static apr_pool_t * pconf
Definition event.c:441
#define AP_MODULE_FLAG_ALWAYS_MERGE
void ap_hook_post_config(ap_HOOK_post_config_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
Definition config.c:105
struct ap_conf_vector_t ap_conf_vector_t
#define AP_DECLARE_MODULE(foo)
void ap_hook_pre_config(ap_HOOK_pre_config_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
Definition config.c:91
request_rec * r
void ap_hook_child_init(ap_HOOK_child_init_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
Definition config.c:167
void * csd
#define DECLINED
Definition httpd.h:457
#define OK
Definition httpd.h:456
#define APLOGNO(n)
Definition http_log.h:117
#define APLOG_INFO
Definition http_log.h:70
#define APLOG_TRACE3
Definition http_log.h:74
#define ap_log_error
Definition http_log.h:370
#define APLOG_MARK
Definition http_log.h:283
#define ap_log_perror
Definition http_log.h:412
#define APLOG_TRACE2
Definition http_log.h:73
#define APLOG_TRACE1
Definition http_log.h:72
void ap_hook_ssl_var_lookup(ap_HOOK_ssl_var_lookup_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
Definition ssl.c:265
void ap_hook_http_scheme(ap_HOOK_http_scheme_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
Definition protocol.c:2589
void ap_hook_ssl_conn_is_ssl(ap_HOOK_ssl_conn_is_ssl_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
Definition ssl.c:262
void ap_hook_post_read_request(ap_HOOK_post_read_request_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
Definition protocol.c:2585
void ap_hook_default_port(ap_HOOK_default_port_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
Definition protocol.c:2591
void ap_hook_ssl_bind_outgoing(ap_HOOK_ssl_bind_outgoing_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
Definition ssl.c:285
void ap_hook_fixups(ap_HOOK_fixups_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
Definition request.c:87
#define APR_HOOK_MIDDLE
Definition apr_hooks.h:303
#define APR_OPTIONAL_HOOK(ns, name, pfn, aszPre, aszSucc, nOrder)
#define APR_RETRIEVE_OPTIONAL_FN(name)
#define APR_OPTIONAL_FN_TYPE(name)
#define APR_REGISTER_OPTIONAL_FN(name)
#define APR_DECLARE_OPTIONAL_FN(ret, name, args)
#define STANDARD20_MODULE_STUFF
apr_size_t size
const char int apr_pool_t * pool
Definition apr_cstr.h:84
#define APR_SUCCESS
Definition apr_errno.h:225
int apr_status_t
Definition apr_errno.h:44
void * data
apr_vformatter_buff_t * c
Definition apr_lib.h:175
apr_uint16_t apr_port_t
const char * s
Definition apr_strings.h:95
Apache connection library.
CORE HTTP Daemon.
Apache Logging library.
HTTP protocol handling.
Apache Request library.
SSL protocol handling.
HTTP Daemon routines.
apr_pool_t * p
Definition md_event.c:32
int ssl_proxy_enable(conn_rec *c)
Definition mod_nw_ssl.c:936
int ssl_engine_disable(conn_rec *c)
Definition mod_nw_ssl.c:943
Proxy Extension Module for Apache.
return NULL
Definition mod_so.c:359
static int tls_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp)
Definition mod_tls.c:66
static apr_status_t tls_post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
Definition mod_tls.c:73
static int hook_pre_connection(conn_rec *c, void *csd)
Definition mod_tls.c:218
static const char * crustls_version(apr_pool_t *p)
Definition mod_tls.c:58
static void tls_init_child(apr_pool_t *p, server_rec *s)
Definition mod_tls.c:213
static const char * tls_hook_http_scheme(const request_rec *r)
Definition mod_tls.c:239
static const char *const mod_http2[]
Definition mod_tls.c:249
static void tls_hooks(apr_pool_t *pool)
Definition mod_tls.c:251
static int hook_connection(conn_rec *c)
Definition mod_tls.c:232
static apr_port_t tls_hook_default_port(const request_rec *r)
Definition mod_tls.c:244
static apr_status_t tls_post_proxy_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
Definition mod_tls.c:106
static int tls_ssl_outgoing(conn_rec *c, ap_conf_vector_t *dir_conf, int enable_ssl)
Definition mod_tls.c:116
Multi-Processing Modules functions.
static int ssl_engine_set(conn_rec *c, ap_conf_vector_t *per_dir_config, int proxy, int enable)
Definition ssl.c:99
static apr_OFN_ssl_engine_set_t * module_ssl_engine_set
Definition ssl.c:80
Structure to store things which are per connection.
Definition httpd.h:1152
A structure that represents the current request.
Definition httpd.h:845
conn_rec * connection
Definition httpd.h:849
A structure to store information for each virtual server.
Definition httpd.h:1322
const char * module_version
Definition tls_conf.h:68
int mod_proxy_post_config_done
Definition tls_conf.h:72
const char * crustls_version
Definition tls_conf.h:69
tls_conf_global_t * global
Definition tls_conf.h:97
void tls_cache_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp)
Definition tls_cache.c:55
void tls_cache_init_child(apr_pool_t *p, server_rec *s)
Definition tls_cache.c:172
void * tls_conf_merge_svr(apr_pool_t *pool, void *basev, void *addv)
Definition tls_conf.c:99
void * tls_conf_create_dir(apr_pool_t *pool, char *dir)
Definition tls_conf.c:138
const command_rec tls_conf_cmds[]
Definition tls_conf.c:736
int tls_proxy_section_post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s, ap_conf_vector_t *section_config)
Definition tls_conf.c:238
void * tls_conf_merge_dir(apr_pool_t *pool, void *basev, void *addv)
Definition tls_conf.c:187
void * tls_conf_create_svr(apr_pool_t *pool, server_rec *s)
Definition tls_conf.c:78
tls_conf_server_t * tls_conf_server_get(server_rec *s)
Definition tls_conf.c:68
apr_status_t tls_core_init(apr_pool_t *p, apr_pool_t *ptemp, server_rec *base_server)
Definition tls_core.c:665
int tls_core_setup_outgoing(conn_rec *c)
Definition tls_core.c:1397
void tls_core_conn_bind(conn_rec *c, ap_conf_vector_t *dir_conf)
Definition tls_core.c:754
void tls_core_conn_disable(conn_rec *c)
Definition tls_core.c:745
int tls_conn_check_ssl(conn_rec *c)
Definition tls_core.c:55
int tls_core_request_check(request_rec *r)
Definition tls_core.c:1348
void tls_filter_register(apr_pool_t *pool)
void tls_filter_conn_init(conn_rec *c)
Definition tls_filter.c:989
int tls_filter_pre_conn_init(conn_rec *c)
Definition tls_filter.c:927
apr_status_t tls_proto_pre_config(apr_pool_t *pool, apr_pool_t *ptemp)
Definition tls_proto.c:478
int tls_var_request_fixup(request_rec *r)
Definition tls_var.c:382
const char * tls_var_lookup(apr_pool_t *p, server_rec *s, conn_rec *c, request_rec *r, const char *name)
Definition tls_var.c:275
#define MOD_TLS_VERSION
Definition tls_version.h:29