54 {
"acme:error:badSignatureAlgorithm",
APR_EINVAL, 1 },
55 {
"acme:error:externalAccountRequired",
APR_EINVAL, 1 },
56 {
"acme:error:invalidContact",
APR_BADARG, 1 },
60 {
"acme:error:rejectedIdentifier",
APR_BADARG, 1 },
63 {
"acme:error:unsupportedIdentifier",
APR_BADARG, 1 },
64 {
"acme:error:userActionRequired",
APR_EAGAIN, 0 },
65 {
"acme:error:badRevocationReason",
APR_EINVAL, 1 },
77 type += strlen(
"urn:ietf:params:");
80 type += strlen(
"urn:");
94 if (!problem)
return 0;
95 if (
strstr(problem,
"urn:ietf:params:") == problem) {
96 problem += strlen(
"urn:ietf:params:");
98 else if (
strstr(problem,
"urn:") == problem) {
99 problem += strlen(
"urn:");
177 if (ctype && !
strcmp(ctype,
"application/problem+json")) {
194 "acme reports %s: %s", ptype,
pdetail);
198 "acme problem %s: %s", ptype,
pdetail);
204 switch (
res->status) {
214 "acme problem unknown: http status %d",
res->status);
282 if (
res->status >= 200 &&
res->status < 300) {
294 s ?
s :
"<failed to serialize!>");
307 if (!processed && req->
on_res) {
315 "http-status=%d, content-type=%s",
345 "sending req: %s %s", req->
method, req->
url);
375 "error retrieving new nonce from ACME server");
390 body->
len = strlen(body->
data);
392 "sending JSON body: %s", body->
data);
416 "HTTP method %s against: %s", req->
method, req->
url);
442 assert(on_json || on_res);
465 assert(on_json || on_res);
621 const char *proxy_url,
const char *ca_file)
677 if (
res->status == 503) {
679 "The ACME server at <%s> reports that Service is Unavailable (503). This "
680 "may happen during maintenance for short periods of time.", acme->
url);
685 else if (
res->status < 200 ||
res->status >= 300) {
687 "The ACME server at <%s> responded with HTTP status %d. This "
688 "is unusual. Please verify that the URL is correct and that you can indeed "
689 "make request from the server to it by other means, e.g. invoking curl/wget.",
704 "response: %s",
s ?
s :
"<failed to serialize!>");
747 "Unable to understand ACME server response from <%s>. "
748 "Wrong ACME protocol version or link?", acme->
url);
785 "Unsuccessful in contacting ACME server at <%s>. If this problem persists, "
786 "please check your network connectivity from your Apache server to the "
787 "ACME server. Also, older servers might have trouble verifying the certificates "
788 "of the ACME server. You can check if you are able to contact it manually via the "
789 "curl command. Sometimes, the ACME server might be down for maintenance, "
790 "so failing to contact it is not an immediate problem. Apache will "
791 "continue retrying this.", acme->
url);
const char apr_size_t len
APR-UTIL Buckets/Bucket Brigades.
char * strstr(char *s1, char *s2)
APR general purpose library routines.
ap_vhost_iterate_conn_cb void * baton
#define APR_STATUS_IS_EAGAIN(s)
#define APR_STATUS_IS_ENOENT(s)
apr_brigade_flush void * ctx
apr_pool_t apr_dbd_t apr_dbd_results_t ** res
const char int apr_pool_t * pool
apr_array_header_t ** result
apr_uint32_t apr_pool_t apr_uint32_t apr_pollset_method_e method
#define apr_pool_create(newpool, parent)
#define apr_pcalloc(p, size)
apr_int32_t apr_int32_t apr_int32_t err
#define apr_time_from_sec(sec)
#define MD_KEY_SUBPROBLEMS
#define MD_KEY_EAB_REQUIRED
const char * md_acme_acct_url_get(md_acme_t *acme)
apr_status_t md_acme_get_json(struct md_json_t **pjson, md_acme_t *acme, const char *url, apr_pool_t *p)
void md_acme_clear_acct(md_acme_t *acme)
apr_status_t md_acme_use_acct_for_md(md_acme_t *acme, struct md_store_t *store, apr_pool_t *p, const char *acct_id, const md_t *md)
static apr_status_t on_response(const md_http_response_t *res, void *data)
const char * md_acme_acct_id_get(md_acme_t *acme)
static apr_status_t acmev2_GET_as_POST_init(md_acme_req_t *req, void *baton)
static md_acme_req_t * md_acme_req_create(md_acme_t *acme, const char *method, const char *url)
apr_status_t md_acme_save_acct(md_acme_t *acme, apr_pool_t *p, md_store_t *store)
apr_status_t md_acme_init(apr_pool_t *p, const char *base, int init_ssl)
int md_acme_problem_is_input_related(const char *problem)
static acme_problem_status_t Problems[]
static apr_status_t on_got_json(md_acme_t *acme, apr_pool_t *p, const apr_table_t *headers, md_json_t *jbody, void *baton)
apr_status_t md_acme_req_body_init(md_acme_req_t *req, md_json_t *payload)
static apr_status_t inspect_problem(md_acme_req_t *req, const md_http_response_t *res)
static const char * base_product
apr_status_t md_acme_setup(md_acme_t *acme, md_result_t *result)
static apr_status_t acmev2_req_init(md_acme_req_t *req, md_json_t *jpayload)
static void req_update_nonce(md_acme_t *acme, apr_table_t *hdrs)
apr_status_t md_acme_POST_new_account(md_acme_t *acme, md_acme_req_init_cb *on_init, md_acme_req_json_cb *on_json, md_acme_req_res_cb *on_res, md_acme_req_err_cb *on_err, void *baton)
static apr_status_t acmev2_POST_new_account(md_acme_t *acme, md_acme_req_init_cb *on_init, md_acme_req_json_cb *on_json, md_acme_req_res_cb *on_res, md_acme_req_err_cb *on_err, void *baton)
static apr_status_t http_update_nonce(const md_http_response_t *res, void *data)
apr_status_t md_acme_use_acct(md_acme_t *acme, md_store_t *store, apr_pool_t *p, const char *acct_id)
static apr_status_t update_directory(const md_http_response_t *res, void *data)
apr_status_t md_acme_GET(md_acme_t *acme, const char *url, md_acme_req_init_cb *on_init, md_acme_req_json_cb *on_json, md_acme_req_res_cb *on_res, md_acme_req_err_cb *on_err, void *baton)
static apr_status_t md_acme_req_send(md_acme_req_t *req)
static apr_status_t problem_status_get(const char *type)
apr_status_t md_acme_POST(md_acme_t *acme, const char *url, md_acme_req_init_cb *on_init, md_acme_req_json_cb *on_json, md_acme_req_res_cb *on_res, md_acme_req_err_cb *on_err, void *baton)
static apr_status_t md_acme_req_done(md_acme_req_t *req, apr_status_t rv)
apr_status_t md_acme_create(md_acme_t **pacme, apr_pool_t *p, const char *url, const char *proxy_url, const char *ca_file)
static apr_status_t acmev2_new_nonce(md_acme_t *acme)
void md_acme_report_result(md_acme_t *acme, apr_status_t rv, struct md_result_t *result)
apr_status_t md_acme_req_json_cb(md_acme_t *acme, apr_pool_t *p, const apr_table_t *headers, struct md_json_t *jbody, void *baton)
apr_status_t md_acme_req_init_cb(md_acme_req_t *req, void *baton)
apr_status_t md_acme_req_res_cb(md_acme_t *acme, const struct md_http_response_t *res, void *baton)
apr_status_t md_acme_req_err_cb(md_acme_req_t *req, const struct md_result_t *result, void *baton)
#define MD_ACME_VERSION_UNKNOWN
#define MD_ACME_VERSION_2
#define MD_ACME_VERSION_1
apr_status_t md_acme_acct_save(md_store_t *store, apr_pool_t *p, md_acme_t *acme, const char **pid, md_acme_acct_t *acct, md_pkey_t *acct_key)
int md_acme_acct_matches_md(md_acme_acct_t *acct, const md_t *md)
apr_status_t md_acme_acct_load(md_acme_acct_t **pacct, md_pkey_t **ppkey, md_store_t *store, md_store_group_t group, const char *name, apr_pool_t *p)
int md_acme_acct_matches_url(md_acme_acct_t *acct, const char *url)
apr_status_t md_acme_acct_validate(md_acme_t *acme, md_store_t *store, apr_pool_t *p)
apr_status_t md_crypt_init(apr_pool_t *pool)
void md_http_set_response_limit(md_http_t *http, apr_off_t resp_limit)
apr_status_t md_http_GET_perform(struct md_http_t *http, const char *url, struct apr_table_t *headers, md_http_response_cb *cb, void *baton)
void md_http_set_ca_file(md_http_t *http, const char *ca_file)
void md_http_set_connect_timeout_default(md_http_t *http, apr_time_t timeout)
apr_status_t md_http_HEAD_perform(struct md_http_t *http, const char *url, struct apr_table_t *headers, md_http_response_cb *cb, void *baton)
void md_http_set_stalling_default(md_http_t *http, long bytes_per_sec, apr_time_t timeout)
void md_http_set_timeout_default(md_http_t *http, apr_time_t timeout)
apr_status_t md_http_create(md_http_t **phttp, apr_pool_t *p, const char *user_agent, const char *proxy_url)
apr_status_t md_http_POSTd_perform(md_http_t *http, const char *url, struct apr_table_t *headers, const char *content_type, const md_data_t *body, md_http_response_cb *cb, void *baton)
md_json_t * md_json_create(apr_pool_t *pool)
int md_json_getb(const md_json_t *json,...)
apr_status_t md_json_sets(const char *value, md_json_t *json,...)
const char * md_json_gets(const md_json_t *json,...)
md_json_t * md_json_getj(md_json_t *json,...)
md_json_t * md_json_clone(apr_pool_t *pool, const md_json_t *json)
apr_status_t md_json_read_http(md_json_t **pjson, apr_pool_t *pool, const md_http_response_t *res)
const char * md_json_dups(apr_pool_t *p, const md_json_t *json,...)
const char * md_json_writep(const md_json_t *json, apr_pool_t *p, md_json_fmt_t fmt)
apr_status_t md_jws_sign(md_json_t **pmsg, apr_pool_t *p, md_data_t *payload, md_json_t *prot_fields, struct md_pkey_t *pkey, const char *key_id)
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,...)
int md_log_is_level(apr_pool_t *p, md_log_level_t level)
void md_result_dup(md_result_t *dest, const md_result_t *src)
void md_result_printf(md_result_t *result, apr_status_t status, const char *fmt,...)
void md_result_problem_set(md_result_t *result, apr_status_t status, const char *problem, const char *detail, const md_json_t *subproblems)
md_result_t * md_result_make(apr_pool_t *p, apr_status_t status)
void md_result_reset(md_result_t *result)
void md_result_log(md_result_t *result, unsigned int level)
void md_result_set(md_result_t *result, apr_status_t status, const char *detail)
apr_status_t md_util_abs_uri_check(apr_pool_t *p, const char *uri, const char **perr)
const char * md_util_parse_ct(apr_pool_t *pool, const char *cth)
void md_data_null(md_data_t *d)
static void init_ssl(void)
struct md_result_t * result
struct md_json_t * req_json
md_acme_req_err_cb * on_err
md_acme_req_res_cb * on_res
md_acme_req_json_cb * on_json
struct md_json_t * resp_json
struct md_json_t * prot_fields
md_acme_req_init_cb * on_init
struct md_acme_t::@21::@22 v1
struct md_result_t * last
md_acme_post_fn * post_new_account_fn
const char * ca_agreement
struct md_acme_t::@21::@23 v2
md_acme_req_init_fn * req_init_fn
struct md_acme_acct_t * acct
struct md_pkey_t * acct_key
md_acme_new_nonce_fn * new_nonce_fn
const struct md_json_t * subproblems