Skip to content

Commit f08cd11

Browse files
authored
Support CA-specific HTTP proxy settings (#413)
* Support CA-specific HTTP proxy settings Allow the MDHttpProxy setting to be set per MDomain. The global MDHttpProxy setting is used by default. Closes #412 * Support CA-specific HTTP proxy settings Add integration tests
1 parent 1084308 commit f08cd11

11 files changed

Lines changed: 83 additions & 16 deletions

File tree

src/md.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ struct md_t {
100100

101101
struct apr_array_header_t *acme_tls_1_domains; /* domains supporting "acme-tls/1" protocol */
102102
const char *dns01_cmd; /* DNS challenge command, override global command */
103+
const char *proxy_url; /* Proxy URL, override global command */
103104

104105
const struct md_srv_conf_t *sc; /* server config where it was defined or NULL */
105106
const char *defn_name; /* config file this MD was defined */
@@ -185,6 +186,7 @@ struct md_t {
185186
#define MD_KEY_PROFILE "profile"
186187
#define MD_KEY_PROFILE_MANDATORY "profile-mandatory"
187188
#define MD_KEY_PROTO "proto"
189+
#define MD_KEY_PROXY_URL "proxy-url"
188190
#define MD_KEY_READY "ready"
189191
#define MD_KEY_REGISTRATION "registration"
190192
#define MD_KEY_RENEW "renew"

src/md_acme.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,7 @@ apr_status_t md_acme_create(md_acme_t **pacme, apr_pool_t *p, const char *url,
645645
acme->p = p;
646646
acme->user_agent = apr_psprintf(p, "%s mod_md/%s",
647647
base_product, MOD_MD_VERSION);
648-
acme->proxy_url = proxy_url? apr_pstrdup(p, proxy_url) : NULL;
648+
acme->proxy_url = apr_pstrdup(p, proxy_url);
649649
acme->max_retries = 99;
650650
acme->ca_file = ca_file;
651651

src/md_acme_drive.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -771,7 +771,8 @@ static apr_status_t acme_renew(md_proto_driver_t *d, md_result_t *result)
771771
md_result_activity_printf(result, "Contacting ACME server for %s at %s",
772772
d->md->name, ca_effective);
773773
if (APR_SUCCESS != (rv = md_acme_create(&ad->acme, d->p, ca_effective,
774-
d->proxy_url, d->ca_file))) {
774+
ad->md->proxy_url ? ad->md->proxy_url : d->proxy_url,
775+
d->ca_file))) {
775776
md_result_printf(result, rv, "setup ACME communications");
776777
md_result_log(result, MD_LOG_ERR);
777778
goto out;
@@ -1033,7 +1034,8 @@ static apr_status_t acme_preload(md_proto_driver_t *d, md_store_group_t load_gro
10331034
}
10341035

10351036
if (APR_SUCCESS != (rv = md_acme_create(&acme, d->p, md->ca_effective,
1036-
d->proxy_url, d->ca_file))) {
1037+
d->md->proxy_url ? d->md->proxy_url : d->proxy_url,
1038+
d->ca_file))) {
10371039
md_result_set(result, rv, "error setting up acme");
10381040
goto leave;
10391041
}
@@ -1142,7 +1144,8 @@ static apr_status_t acme_get_ari(md_proto_driver_t *d,
11421144
}
11431145

11441146
if (APR_SUCCESS != (rv = md_acme_create(&ad->acme, d->p, ca_effective,
1145-
d->proxy_url, d->ca_file))) {
1147+
d->md->proxy_url ? d->md->proxy_url : d->proxy_url,
1148+
d->ca_file))) {
11461149
md_log_perror(MD_LOG_MARK, MD_LOG_ERR, rv, d->p,
11471150
"create ACME communications");
11481151
goto out;

src/md_core.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ md_t *md_clone(apr_pool_t *p, const md_t *src)
258258
md->acme_tls_1_domains = md_array_str_compact(p, src->acme_tls_1_domains, 0);
259259
md->stapling = src->stapling;
260260
if (src->dns01_cmd) md->dns01_cmd = apr_pstrdup(p, src->dns01_cmd);
261+
if (src->proxy_url) md->proxy_url = apr_pstrdup(p, src->proxy_url);
261262
if (src->cert_files) md->cert_files = md_array_str_clone(p, src->cert_files);
262263
if (src->pkey_files) md->pkey_files = md_array_str_clone(p, src->pkey_files);
263264
}
@@ -315,6 +316,7 @@ md_json_t *md_to_json(const md_t *md, apr_pool_t *p)
315316
if (md->pkey_files) md_json_setsa(md->pkey_files, json, MD_KEY_PKEY_FILES, NULL);
316317
md_json_setb(md->stapling > 0, json, MD_KEY_STAPLING, NULL);
317318
if (md->dns01_cmd) md_json_sets(md->dns01_cmd, json, MD_KEY_CMD_DNS01, NULL);
319+
if (md->proxy_url) md_json_sets(md->proxy_url, json, MD_KEY_PROXY_URL, NULL);
318320
if (md->ca_eab_kid && strcmp("none", md->ca_eab_kid)) {
319321
md_json_sets(md->ca_eab_kid, json, MD_KEY_EAB, MD_KEY_KID, NULL);
320322
if (md->ca_eab_hmac) md_json_sets(md->ca_eab_hmac, json, MD_KEY_EAB, MD_KEY_HMAC, NULL);
@@ -384,6 +386,7 @@ md_t *md_from_json(md_json_t *json, apr_pool_t *p)
384386
}
385387
md->stapling = (int)md_json_getb(json, MD_KEY_STAPLING, NULL);
386388
md->dns01_cmd = md_json_dups(p, json, MD_KEY_CMD_DNS01, NULL);
389+
md->proxy_url = md_json_dups(p, json, MD_KEY_PROXY_URL, NULL);
387390
if (md_json_has_key(json, MD_KEY_EAB, NULL)) {
388391
md->ca_eab_kid = md_json_dups(p, json, MD_KEY_EAB, MD_KEY_KID, NULL);
389392
md->ca_eab_hmac = md_json_dups(p, json, MD_KEY_EAB, MD_KEY_HMAC, NULL);

src/md_http.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ apr_status_t md_http_create(md_http_t **phttp, apr_pool_t *p, const char *user_a
8282
http->pool = p;
8383
http->impl = cur_impl;
8484
http->user_agent = apr_pstrdup(p, user_agent);
85-
http->proxy_url = proxy_url? apr_pstrdup(p, proxy_url) : NULL;
85+
http->proxy_url = apr_pstrdup(p, proxy_url);
8686
http->bucket_alloc = apr_bucket_alloc_create(p);
8787
if (!http->bucket_alloc) {
8888
return APR_EGENERAL;

src/md_reg.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ apr_status_t md_reg_create(md_reg_t **preg, apr_pool_t *p, struct md_store_t *st
110110
reg->certs = apr_hash_make(p);
111111
reg->can_http = 1;
112112
reg->can_https = 1;
113-
reg->proxy_url = proxy_url? apr_pstrdup(p, proxy_url) : NULL;
113+
reg->proxy_url = apr_pstrdup(p, proxy_url);
114114
reg->ca_file = (ca_file && apr_cstr_casecmp("none", ca_file))?
115115
apr_pstrdup(p, ca_file) : NULL;
116116
reg->min_delay = min_delay;

src/mod_md.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -855,6 +855,7 @@ static apr_status_t md_post_config_before_ssl(apr_pool_t *p, apr_pool_t *plog,
855855
apr_status_t rv = APR_SUCCESS;
856856
int dry_run = 0, log_level = APLOG_DEBUG;
857857
md_store_t *store;
858+
const char *proxy_url;
858859

859860
apr_pool_userdata_get(&data, mod_md_init_key, s->process->pool);
860861
if (data == NULL) {
@@ -893,7 +894,9 @@ static apr_status_t md_post_config_before_ssl(apr_pool_t *p, apr_pool_t *plog,
893894
rv = setup_store(&store, mc, p, s);
894895
if (APR_SUCCESS != rv) goto leave;
895896

896-
rv = md_reg_create(&mc->reg, p, store, mc->proxy_url, mc->ca_certs,
897+
proxy_url = apr_table_get(mc->env, MD_KEY_PROXY_URL);
898+
899+
rv = md_reg_create(&mc->reg, p, store, proxy_url, mc->ca_certs,
897900
mc->min_delay, mc->retry_failover,
898901
mc->use_store_locks, mc->lock_wait_timeout);
899902
if (APR_SUCCESS != rv) {
@@ -903,7 +906,7 @@ static apr_status_t md_post_config_before_ssl(apr_pool_t *p, apr_pool_t *plog,
903906

904907
/* renew on 30% remaining /*/
905908
rv = md_ocsp_reg_make(&mc->ocsp, p, store, mc->ocsp_renew_window,
906-
AP_SERVER_BASEVERSION, mc->proxy_url,
909+
AP_SERVER_BASEVERSION, proxy_url,
907910
mc->min_delay);
908911
if (APR_SUCCESS != rv) {
909912
ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, APLOGNO(10196) "setup ocsp registry");

src/mod_md_config.c

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ static md_mod_conf_t defmc = {
6161
#else
6262
MD_DEFAULT_BASE_DIR,
6363
#endif
64-
NULL, /* proxy url for outgoing http */
6564
NULL, /* md_reg_t */
6665
NULL, /* md_ocsp_reg_t */
6766
80, /* local http: port */
@@ -127,6 +126,7 @@ static md_srv_conf_t defconf = {
127126
1, /* staple others */
128127
1, /* ACME ARI renewals */
129128
NULL, /* dns01_cmd */
129+
NULL, /* proxy URL */
130130
NULL, /* currently defined md */
131131
NULL, /* assigned md, post config */
132132
0, /* is_ssl, set during mod_ssl post_config */
@@ -185,6 +185,7 @@ static void srv_conf_props_clear(md_srv_conf_t *sc)
185185
sc->staple_others = DEF_VAL;
186186
sc->ari_renewals = DEF_VAL;
187187
sc->dns01_cmd = NULL;
188+
sc->proxy_url = NULL;
188189
}
189190

190191
static void srv_conf_props_copy(md_srv_conf_t *to, const md_srv_conf_t *from)
@@ -209,6 +210,7 @@ static void srv_conf_props_copy(md_srv_conf_t *to, const md_srv_conf_t *from)
209210
to->staple_others = from->staple_others;
210211
to->ari_renewals = from->ari_renewals;
211212
to->dns01_cmd = from->dns01_cmd;
213+
to->proxy_url = from->proxy_url;
212214
}
213215

214216
static void srv_conf_props_apply(md_t *md, const md_srv_conf_t *from, apr_pool_t *p)
@@ -236,6 +238,7 @@ static void srv_conf_props_apply(md_t *md, const md_srv_conf_t *from, apr_pool_t
236238
if (from->ari_renewals != DEF_VAL) md->ari_renewals = from->ari_renewals;
237239
if (from->stapling != DEF_VAL) md->stapling = from->stapling;
238240
if (from->dns01_cmd) md->dns01_cmd = from->dns01_cmd;
241+
if (from->proxy_url) md->proxy_url = from->proxy_url;
239242
}
240243

241244
void *md_config_create_svr(apr_pool_t *pool, server_rec *s)
@@ -285,6 +288,7 @@ static void *md_config_merge(apr_pool_t *pool, void *basev, void *addv)
285288
nsc->staple_others = (add->staple_others != DEF_VAL)? add->staple_others : base->staple_others;
286289
nsc->ari_renewals = (add->ari_renewals != DEF_VAL)? add->ari_renewals : base->ari_renewals;
287290
nsc->dns01_cmd = (add->dns01_cmd)? add->dns01_cmd : base->dns01_cmd;
291+
nsc->proxy_url = (add->proxy_url)? add->proxy_url : base->proxy_url;
288292
nsc->current = NULL;
289293

290294
return nsc;
@@ -865,14 +869,20 @@ static const char *md_config_set_proxy(cmd_parms *cmd, void *arg, const char *va
865869
md_srv_conf_t *sc = md_config_get(cmd->server);
866870
const char *err;
867871

868-
if ((err = md_conf_check_location(cmd, MD_LOC_NOT_MD))) {
872+
if ((err = md_conf_check_location(cmd, MD_LOC_ALL))) {
869873
return err;
870874
}
871875
md_util_abs_http_uri_check(cmd->pool, value, &err);
872876
if (err) {
873877
return err;
874878
}
875-
sc->mc->proxy_url = value;
879+
880+
if (inside_md_section(cmd)) {
881+
sc->proxy_url = value;
882+
} else {
883+
apr_table_set(sc->mc->env, MD_KEY_PROXY_URL, value);
884+
}
885+
876886
(void)arg;
877887
return NULL;
878888
}
@@ -1471,8 +1481,6 @@ const char *md_config_gets(const md_srv_conf_t *sc, md_config_var_t var)
14711481
return sc->ca_proto? sc->ca_proto : defconf.ca_proto;
14721482
case MD_CONFIG_BASE_DIR:
14731483
return sc->mc->base_dir;
1474-
case MD_CONFIG_PROXY:
1475-
return sc->mc->proxy_url;
14761484
case MD_CONFIG_CA_AGREEMENT:
14771485
return sc->ca_agreement? sc->ca_agreement : defconf.ca_agreement;
14781486
case MD_CONFIG_NOTIFY_CMD:

src/mod_md_config.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ typedef enum {
3232
MD_CONFIG_RENEW_WINDOW,
3333
MD_CONFIG_WARN_WINDOW,
3434
MD_CONFIG_TRANSITIVE,
35-
MD_CONFIG_PROXY,
3635
MD_CONFIG_REQUIRE_HTTPS,
3736
MD_CONFIG_MUST_STAPLE,
3837
MD_CONFIG_NOTIFY_CMD,
@@ -53,7 +52,6 @@ typedef struct md_mod_conf_t md_mod_conf_t;
5352
struct md_mod_conf_t {
5453
apr_array_header_t *mds; /* all md_t* defined in the config, shared */
5554
const char *base_dir; /* base dir for store */
56-
const char *proxy_url; /* proxy url to use (or NULL) */
5755
struct md_reg_t *reg; /* md registry instance */
5856
struct md_ocsp_reg_t *ocsp; /* ocsp status registry */
5957

@@ -115,6 +113,7 @@ typedef struct md_srv_conf_t {
115113
int ari_renewals; /* ACME ARI extension enabled */
116114

117115
const char *dns01_cmd; /* DNS challenge command, override global command */
116+
const char *proxy_url; /* Proxy URL, override global command */
118117

119118
md_t *current; /* md currently defined in <MDomainSet xxx> section */
120119
struct apr_array_header_t *assigned; /* post_config: MDs that apply to this server */

test/modules/md/md_conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def __init__(self, env: MDTestEnv, text=None, std_ports=True,
4444
" ProxyRequests On",
4545
" ProxyVia On",
4646
" # be totally open",
47-
" AllowCONNECT 0-56535",
47+
" AllowCONNECT 0-65535",
4848
" <Proxy *>",
4949
" # No require or other restrictions, this is just a test server",
5050
" </Proxy>",

0 commit comments

Comments
 (0)