68#if defined(AP_MODULE_FLAG_NONE)
88#define LOG_BUF_LEN 16*1024
155 const char *
const *
argv;
170 if (min_interim > 0) {
177 "%s: rate limiting notification about '%s'", job->
mdomain,
reason);
183 if (
mc->notify_cmd) {
191 "MDNotifyCmd %s failed with exit code %d.",
199 "The Managed Domain %s has been setup and changes "
200 "will be activated on next (graceful) server restart.", job->
mdomain);
202 if (
mc->message_cmd) {
210 "MDMessageCmd %s failed with exit code %d.",
280 const char *base_dir;
297 "setup challenges directory");
381 "Virtual Host %s:%d matches Managed Domain '%s', but the "
382 "name/alias %s itself is not managed. A requested MD certificate "
383 "will not match ServerName.",
384 s->server_hostname,
s->port, md->
name, domain);
397 "md[%s]: auto add, covers name %s", md->
name,
s->server_hostname);
398 for (
i = 0;
s->names &&
i <
s->names->nelts; ++
i) {
404 "md[%s]: auto add, covers alias %s", md->
name,
name);
415 if (
sa->host_port ==
port) {
432 int can_http, can_https;
436 can_http = can_https = 0;
440 && (!
lr->protocol || !
strncmp(
"http",
lr->protocol, 4))) {
444 && (!
lr->protocol || !
strncmp(
"http",
lr->protocol, 4))) {
449 if (
mc->can_http < 0)
mc->can_http = can_http;
450 if (
mc->can_https < 0)
mc->can_https = can_https;
452 "server seems%s reachable via http: and%s reachable via https:",
453 mc->can_http?
"" :
" not",
mc->can_https?
"" :
" not");
480 for (
s = base_server;
s;
s =
s->
next) {
483 if (base_server ==
s && !
mc->manage_base_server)
continue;
516 "md[%s]: auto add domains", md->
name);
518 for (
s = base_server;
s;
s =
s->
next) {
548 if (
NULL ==
s &&
mc->manage_base_server)
s = base_server;
551 "%s: no https server_rec found for %s", md->
name, domain);
556 "%s: https server_rec for %s does not have protocol %s enabled",
571 const char *domain, *
uri;
579 for (
s = base_server;
s;
s =
s->
next) {
580 if (!
mc->manage_base_server &&
s == base_server) {
609 "Server %s:%d matches md %s (config %s, match-mode=%d) "
610 "for domain %s, has now %d MDs",
622 "%s: added contact %s", md->
name,
uri);
630 "%s: added contact %s", md->
name,
uri);
647 for (
i = 0;
i <
mc->mds->nelts; ++
i) {
681 for (
i = 0;
i <
mc->mds->nelts; ++
i) {
687 for (j = 0; j <
i; ++j) {
691 "two Managed Domains have an overlap in domain '%s'"
692 ", first definition in %s(line %d), second in %s(line %d)",
694 omd->defn_name,
omd->defn_line_number);
703 "The Managed Domain '%s' "
704 "needs one MDCertificateKeyFile for each MDCertificateFile.",
712 "The Managed Domain '%s' "
713 "has MDCertificateKeyFile(s) but no MDCertificateFile.",
720 "Completed MD[%s, CA=%s, Proto=%s, Agreement=%s, renew-mode=%d "
721 "renew_window=%s, warn_window=%s",
736 "checking duplicate ssl assignments");
737 for (
s = base_server;
s;
s =
s->
next) {
744 "conflict: %d MDs match to SSL VirtualHost %s, there can at most be one.",
764 for (
s = base_server;
s;
s =
s->
next) {
778 "MD %s does not match any VirtualHost with 'SSLEngine on', "
779 "but is configured to require https. This cannot work.", md->
name);
785 "No VirtualHost matches Managed Domain %s", md->
name);
804 for (
i = 0;
i <
mc->mds->nelts; ++
i) {
810 "in error state, unable to drive forward. This "
811 "indicates an incomplete or inconsistent configuration. "
812 "Please check the log for warnings in this regard.");
862 "initializing post config dry run");
878 mc->dry_run = dry_run;
887 mc->min_delay,
mc->retry_failover,
888 mc->use_store_locks,
mc->lock_wait_timeout);
933 "unable to obtain global registry lock, "
934 "renewed certificates may remain inactive on "
935 "this httpd instance!");
942 "syncing %d mds to registry",
mc->mds->nelts);
974 for (
i = 0;
i <
mc->mds->nelts; ++
i) {
989 "md[%s]: error syncing to store", md->
name);
1007 "%d out of %d mds need watching", watched,
mc->mds->nelts);
1130 "get_certificates called for vhost %s.",
s->server_hostname);
1135 "asked for certificate of server %s which has no md config",
1136 s->server_hostname);
1154 "conflict: %d MDs match Virtualhost %s which uses SSL, however "
1155 "there can be at most 1.",
1185 "retrieving credentials for MD %s (%s)",
1213 "%s: providing %s fallback certificate for server %s",
1224 "%s[state=%d]: providing certificates for server %s",
1228 *pkey_files = key_files;
1246 s->server_hostname);
1253 "host '%s' is covered by a Managed Domain, but "
1254 "certificate/key files are already configured "
1255 "for it (most likely via SSLCertificateFile).",
1256 s->server_hostname);
1259 "host '%s' is covered by a Managed Domaina and "
1260 "is being provided with %d key/certificate files.",
1278 s->server_hostname);
1289 const char **
pcert_pem,
const char **pkey_pem)
1297 const char *cert_pem, *
key_pem;
1309 "Answer challenge[tls-alpn-01] for %s",
servername);
1317 (
void**)&cert_pem,
c->pool);
1327 "Found challenge cert %s, key %s for %s",
1337 "%s: unknown tls-alpn-01 challenge host",
servername);
1348#define WELL_KNOWN_PREFIX "/.well-known/"
1349#define ACME_CHALLENGE_PREFIX WELL_KNOWN_PREFIX"acme-challenge/"
1365 "access inside /.well-known/acme-challenge for %s%s",
1420 "loading challenge %s from store",
name);
1435 const char *
s, *
host;
1476 uri.scheme = (
char*)
"https";
1478 uri.port_str = (
char*)
"443";
1506 static const char *
const mod_ssl[] = {
"mod_ssl.c",
"mod_tls.c",
NULL};
1507 static const char *
const mod_wd[] = {
"mod_watchdog.c",
NULL};
1542#if AP_MODULE_MAGIC_AT_LEAST(20120211, 105)
1546#error "This version of mod_md requires Apache httpd 2.4.48 or newer."
Apache Listeners Library.
int int const char ** match
const char apr_size_t len
#define AP_SERVER_BASEVERSION
APR-UTIL registration of functions exported by modules.
apr_status_t apr_dir_make_recursive(const char *path, apr_fileperms_t perm, apr_pool_t *pool)
#define AP_MODULE_FLAG_ALWAYS_MERGE
#define ap_get_module_config(v, m)
void ap_hook_post_config(ap_HOOK_post_config_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
#define AP_DECLARE_MODULE(foo)
char * ap_server_root_relative(apr_pool_t *p, const char *fname)
void ap_hook_handler(ap_HOOK_handler_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
#define ap_set_module_config(v, m, val)
void ap_hook_child_init(ap_HOOK_child_init_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
apr_status_t ap_pass_brigade(ap_filter_t *filter, apr_bucket_brigade *bucket)
char * ap_construct_url(apr_pool_t *p, const char *uri, request_rec *r)
const char * ap_get_server_name_for_url(request_rec *r)
ap_listen_rec * ap_listeners
#define APLOG_IS_LEVEL(s, level)
#define APLOG_MODULE_INDEX
void ap_hook_ssl_answer_challenge(ap_HOOK_ssl_answer_challenge_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
void ap_hook_protocol_get(ap_HOOK_protocol_get_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
void ap_hook_protocol_propose(ap_HOOK_protocol_propose_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
void ap_hook_ssl_ocsp_prime_hook(ap_HOOK_ssl_ocsp_prime_hook_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
void ap_hook_protocol_switch(ap_HOOK_protocol_switch_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
void ap_hook_post_read_request(ap_HOOK_post_read_request_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
void ap_hook_ssl_add_fallback_cert_files(ap_HOOK_ssl_add_fallback_cert_files_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
void ap_hook_ssl_add_cert_files(ap_HOOK_ssl_add_cert_files_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
int ap_is_allowed_protocol(conn_rec *c, request_rec *r, server_rec *s, const char *protocol)
void ap_hook_ssl_ocsp_get_resp_hook(ap_HOOK_ssl_ocsp_get_resp_hook_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
int ap_ssl_conn_is_ssl(conn_rec *c)
const char apr_port_t port
ap_vhost_iterate_conn_cb void * baton
#define APR_STATUS_IS_ENOENT(s)
apr_brigade_flush void * ctx
apr_pool_t apr_dbd_t apr_dbd_results_t ** res
#define APR_OPTIONAL_HOOK(ns, name, pfn, aszPre, aszSucc, nOrder)
#define APR_URI_UNP_OMITUSERINFO
#define HTTP_INTERNAL_SERVER_ERROR
#define HTTP_MOVED_TEMPORARILY
#define HTTP_PERMANENT_REDIRECT
#define HTTP_MOVED_PERMANENTLY
#define HTTP_NOT_IMPLEMENTED
#define HTTP_TEMPORARY_REDIRECT
#define STANDARD20_MODULE_STUFF
#define ap_strchr_c(s, c)
int ap_array_str_contains(const apr_array_header_t *array, const char *s)
const char int apr_pool_t * pool
const char apr_file_t * file
void const char apr_status_t(* cleanup)(void *))
apr_array_header_t ** result
#define APR_HASH_KEY_STRING
apr_vformatter_buff_t const char * fmt
apr_vformatter_buff_t * c
apr_vformatter_buff_t const char va_list ap
#define apr_pcalloc(p, size)
#define APR_ARRAY_PUSH(ary, type)
#define APR_ARRAY_IDX(ary, i, type)
#define apr_time_from_sec(sec)
static const char *const mod_ssl[]
int md_cert_count(const md_t *md)
const char * md_common_name(const md_t *md1, const md_t *md2)
md_t * md_get_by_domain(struct apr_array_header_t *mds, const char *domain)
int md_contains(const md_t *md, const char *domain, int case_sensitive)
apr_status_t md_acme_init(apr_pool_t *p, const char *base, int init_ssl)
#define MD_AUTHZ_CHA_HTTP_01
void tls_alpn01_fnames(apr_pool_t *p, md_pkey_spec_t *kspec, char **keyfn, char **certfn)
#define MD_AUTHZ_TYPE_TLSALPN01
md_pkey_spec_t * md_pkeys_spec_get(const md_pkeys_spec_t *pks, int index)
apr_status_t md_cert_self_sign(md_cert_t **pcert, const char *cn, apr_array_header_t *domains, md_pkey_t *pkey, apr_interval_time_t valid_for, apr_pool_t *p)
const char * md_pkey_spec_name(const md_pkey_spec_t *spec)
int md_pkeys_spec_count(const md_pkeys_spec_t *pks)
apr_status_t md_pkey_gen(md_pkey_t **ppkey, apr_pool_t *p, md_pkey_spec_t *spec)
int md_pkeys_spec_is_empty(const md_pkeys_spec_t *pks)
md_http_impl_t * md_curl_get_impl(apr_pool_t *p)
void md_event_subscribe(md_event_cb *cb, void *baton)
void md_event_init(apr_pool_t *p)
void md_http_use_implementation(md_http_impl_t *impl)
void md_log_perror(const char *file, int line, md_log_level_t level, apr_status_t rv, apr_pool_t *p, const char *fmt,...)
void md_log_set(md_log_level_cb *level_cb, md_log_print_cb *print_cb, void *baton)
static md_log_level_cb * log_level
apr_size_t md_ocsp_count(md_ocsp_reg_t *reg)
apr_status_t md_ocsp_reg_make(md_ocsp_reg_t **preg, apr_pool_t *p, md_store_t *store, const md_timeslice_t *renew_window, const char *user_agent, const char *proxy_url, apr_time_t min_delay)
apr_status_t md_reg_cleanup_challenges(md_reg_t *reg, apr_pool_t *p, apr_pool_t *ptemp, apr_array_header_t *mds)
apr_status_t md_reg_sync_start(md_reg_t *reg, apr_array_header_t *master_mds, apr_pool_t *p)
void md_reg_set_warn_window_default(md_reg_t *reg, md_timeslice_t *warn_window)
apr_status_t md_reg_freeze_domains(md_reg_t *reg, apr_array_header_t *mds)
apr_status_t md_reg_set_props(md_reg_t *reg, apr_pool_t *p, int can_http, int can_https)
void md_reg_unlock_global(md_reg_t *reg, apr_pool_t *p)
apr_status_t md_reg_lock_global(md_reg_t *reg, apr_pool_t *p)
apr_status_t md_reg_create(md_reg_t **preg, apr_pool_t *p, struct md_store_t *store, const char *proxy_url, const char *ca_file, apr_time_t min_delay, int retry_failover, int use_store_locks, apr_time_t lock_wait_timeout)
apr_status_t md_reg_get_cred_files(const char **pkeyfile, const char **pcertfile, md_reg_t *reg, md_store_group_t group, const md_t *md, md_pkey_spec_t *spec, apr_pool_t *p)
apr_status_t md_reg_load_stagings(md_reg_t *reg, apr_array_header_t *mds, apr_table_t *env, apr_pool_t *p)
void md_reg_set_renew_window_default(md_reg_t *reg, md_timeslice_t *renew_window)
apr_status_t md_reg_test_init(md_reg_t *reg, const md_t *md, struct apr_table_t *env, md_result_t *result, apr_pool_t *p)
apr_status_t md_reg_sync_finish(md_reg_t *reg, md_t *md, apr_pool_t *p, apr_pool_t *ptemp)
struct md_store_t * md_reg_store_get(md_reg_t *reg)
md_result_t * md_result_make(apr_pool_t *p, apr_status_t status)
void md_result_log(md_result_t *result, unsigned int level)
void md_result_problem_printf(md_result_t *result, apr_status_t status, const char *problem, const char *fmt,...)
void md_result_set(md_result_t *result, apr_status_t status, const char *detail)
#define MD_RESULT_LOG_ID(logno)
apr_time_t md_job_log_get_time_of_latest(md_job_t *job, const char *type)
void md_job_log_append(md_job_t *job, const char *type, const char *status, const char *detail)
apr_status_t md_store_save(md_store_t *store, apr_pool_t *p, md_store_group_t group, const char *name, const char *aspect, md_store_vtype_t vtype, void *data, int create)
const char * md_pkey_filename(md_pkey_spec_t *spec, apr_pool_t *p)
apr_status_t md_store_get_fname(const char **pfname, md_store_t *store, md_store_group_t group, const char *name, const char *aspect, apr_pool_t *p)
const char * md_chain_filename(md_pkey_spec_t *spec, apr_pool_t *p)
apr_status_t md_store_load(md_store_t *store, md_store_group_t group, const char *name, const char *aspect, md_store_vtype_t vtype, void **pdata, apr_pool_t *p)
apr_status_t md_store_fs_init(md_store_t **pstore, apr_pool_t *p, const char *path)
apr_status_t md_store_fs_set_event_cb(struct md_store_t *store, md_store_fs_cb *cb, void *baton)
#define MD_FPROT_D_UALL_GREAD
const char * md_timeslice_format(const md_timeslice_t *ts, apr_pool_t *p)
apr_time_t md_timeperiod_length(const md_timeperiod_t *period)
int md_dns_is_wildcard(apr_pool_t *p, const char *domain)
int md_array_is_empty(const struct apr_array_header_t *array)
int md_is_wild_match(const apr_array_header_t *domains, const char *name)
const char * md_util_schemify(apr_pool_t *p, const char *s, const char *def_scheme)
int md_array_str_index(const apr_array_header_t *array, const char *s, int start, int case_sensitive)
apr_status_t md_util_exec(apr_pool_t *p, const char *cmd, const char *const *argv, int *exit_code)
int md_file_exists(const char *fname, apr_pool_t *p)
int md_dns_matches(const char *pattern, const char *domain)
#define WELL_KNOWN_PREFIX
static apr_status_t check_group_dir(md_store_t *store, md_store_group_t group, apr_pool_t *p, server_rec *s)
static apr_status_t check_invalid_duplicates(server_rec *base_server)
static int init_cert_watch_status(md_mod_conf_t *mc, apr_pool_t *p, apr_pool_t *ptemp, server_rec *s)
static void init_acme_tls_1_domains(md_t *md, server_rec *base_server)
static void merge_srv_config(md_t *md, md_srv_conf_t *base_sc, apr_pool_t *p)
static void md_hooks(apr_pool_t *pool)
static int md_require_https_maybe(request_rec *r)
static apr_status_t setup_store(md_store_t **pstore, md_mod_conf_t *mc, apr_pool_t *p, server_rec *s)
static int log_is_level(void *baton, apr_pool_t *p, md_log_level_t level)
static apr_status_t auto_add_domains(md_t *md, server_rec *base_server, apr_pool_t *p)
static apr_status_t notify(md_job_t *job, const char *reason, md_result_t *result, apr_pool_t *p, void *baton)
static apr_status_t get_certificates(server_rec *s, apr_pool_t *p, int fallback, apr_array_header_t **pcert_files, apr_array_header_t **pkey_files)
static apr_status_t cleanup_setups(void *dummy)
static server_rec * log_server
static void init_ssl(void)
static notify_rate notify_rates[]
static int md_protocol_switch(conn_rec *c, request_rec *r, server_rec *s, const char *protocol)
static int md_protocol_propose(conn_rec *c, request_rec *r, server_rec *s, const apr_array_header_t *offers, apr_array_header_t *proposals)
static apr_status_t merge_mds_with_conf(md_mod_conf_t *mc, apr_pool_t *p, server_rec *base_server, int log_level)
static int md_http_challenge_pr(request_rec *r)
static apr_status_t detect_supported_protocols(md_mod_conf_t *mc, server_rec *s, apr_pool_t *p, int log_level)
static apr_status_t md_post_config_before_ssl(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
static const char * md_protocol_get(const conn_rec *c)
#define ACME_CHALLENGE_PREFIX
static int md_answer_challenge(conn_rec *c, const char *servername, const char **pcert_pem, const char **pkey_pem)
static void log_print(const char *file, int line, md_log_level_t level, apr_status_t rv, void *baton, apr_pool_t *p, const char *fmt, va_list ap)
static int uses_port(server_rec *s, int port)
static apr_status_t md_cover_server(md_t *md, server_rec *s, int *pupdates, apr_pool_t *p)
static int md_add_fallback_cert_files(server_rec *s, apr_pool_t *p, apr_array_header_t *cert_files, apr_array_header_t *key_files)
static apr_status_t on_event(const char *event, const char *mdomain, void *baton, md_job_t *job, md_result_t *result, apr_pool_t *p)
static void fallback_fnames(apr_pool_t *p, md_pkey_spec_t *kspec, char **keyfn, char **certfn)
static apr_status_t link_mds_to_servers(md_mod_conf_t *mc, server_rec *s, apr_pool_t *p)
static void md_child_init(apr_pool_t *pool, server_rec *s)
static int md_add_cert_files(server_rec *s, apr_pool_t *p, apr_array_header_t *cert_files, apr_array_header_t *key_files)
static void init_setups(apr_pool_t *p, server_rec *base_server)
static server_rec * get_public_https_server(md_t *md, const char *domain, server_rec *base_server)
static apr_status_t check_usage(md_mod_conf_t *mc, md_t *md, server_rec *base_server, apr_pool_t *p, apr_pool_t *ptemp)
static apr_status_t store_file_ev(void *baton, struct md_store_t *store, md_store_fs_ev_t ev, unsigned int group, const char *fname, apr_filetype_e ftype, apr_pool_t *p)
static apr_status_t link_md_to_servers(md_mod_conf_t *mc, md_t *md, server_rec *base_server, apr_pool_t *p)
static apr_status_t make_fallback_cert(md_store_t *store, const md_t *md, md_pkey_spec_t *kspec, server_rec *s, apr_pool_t *p, char *keyfn, char *crtfn)
static apr_status_t md_post_config_after_ssl(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
static apr_status_t check_coverage(md_t *md, const char *domain, server_rec *s, int *pupdates, apr_pool_t *p)
md_srv_conf_t * md_config_get(server_rec *s)
const char * md_config_gets(const md_srv_conf_t *sc, md_config_var_t var)
const command_rec md_cmds[]
void md_config_get_timespan(md_timeslice_t **pspan, const md_srv_conf_t *sc, md_config_var_t var)
void * md_config_create_svr(apr_pool_t *pool, server_rec *s)
md_srv_conf_t * md_config_get_unique(server_rec *s, apr_pool_t *p)
apr_status_t md_config_post_config(server_rec *s, apr_pool_t *p)
const md_t * md_get_for_domain(server_rec *s, const char *domain)
void * md_config_merge_svr(apr_pool_t *pool, void *basev, void *addv)
int md_config_geti(const md_srv_conf_t *sc, md_config_var_t var)
@ MD_CONFIG_REQUIRE_HTTPS
int md_will_renew_cert(const md_t *md)
apr_status_t md_renew_start_watching(md_mod_conf_t *mc, server_rec *s, apr_pool_t *p)
int md_ocsp_provide_status(server_rec *s, conn_rec *c, const char *id, apr_size_t id_len, ap_ssl_ocsp_copy_resp *cb, void *userdata)
int md_ocsp_prime_status(server_rec *s, apr_pool_t *p, const char *id, apr_size_t id_len, const char *pem)
apr_status_t md_ocsp_start_watching(md_mod_conf_t *mc, server_rec *s, apr_pool_t *p)
apr_status_t md_make_worker_accessible(const char *fname, apr_pool_t *p)
int md_status_handler(request_rec *r)
int md_http_cert_status(request_rec *r)
int md_domains_status_hook(request_rec *r, int flags)
int md_ocsp_status_hook(request_rec *r, int flags)
Status Report Extension Module to Apache.
Multi-Processing Modules functions.
Apache's listeners record.
Structure to store things which are per connection.
struct apr_bucket_alloc_t * bucket_alloc
struct apr_array_header_t * ca_urls
struct apr_array_header_t * ca_challenges
struct apr_array_header_t * assigned
struct md_pkeys_spec_t * pks
md_timeslice_t * renew_window
struct apr_array_header_t * domains
const struct md_srv_conf_t * sc
md_timeslice_t * warn_window
struct apr_array_header_t * acme_tls_1_domains
md_require_t require_https
struct apr_array_header_t * pkey_files
unsigned defn_line_number
const char * ca_effective
struct apr_array_header_t * ca_urls
struct md_pkeys_spec_t * pks
const char * ca_agreement
struct apr_array_header_t * contacts
struct apr_array_header_t * cert_files
struct apr_array_header_t * ca_challenges
A structure that represents the current request.
struct ap_filter_t * output_filters
apr_table_t * headers_out
A structure to be used for Per-vhost config.
A structure to store information for each virtual server.
struct ap_conf_vector_t * module_config
int ap_matches_request_vhost(request_rec *r, const char *host, apr_port_t port)
typedef int(WSAAPI *apr_winapi_fpt_WSAPoll)(IN OUT LPWSAPOLLFD fdArray