Download raw body.
allow wildcard altnames in acme-client.conf
If you put a wildcard alternate name in acme-client.conf, you currently
get a syntax error:
/etc/acme-client.conf:20: syntax error
which is reasonable, since this generally requires answering challenges
that acme-client does not support, such as dns-01.
In some circumstances, though, acme-client doesn't need to answer any
challenges to get such a certificate issued. For instance, our
commercial certificate provider will issue anything under our organization's
domain without any challenges, since EAB is enough proof for them.
Given that, I'd like to adjust the config parser so wildcards
are allowed in alternate names with the diff below.
If you try to use this against an ACME server that will require a
challenge, you get something like this (from pebble, in this case):
acme-client: https://localhost:14000/authZ/JsLllu81TMKVxklrqHxZnccTsX2WfSyer6uigfWBUJo: bad challenge
which is about as helpful as the syntax error to my mind.
ok? or do I need to wait until there's a challenge type we can
support?
Index: parse.h
===================================================================
RCS file: /cvs/src/usr.sbin/acme-client/parse.h,v
diff -u -p -r1.18 parse.h
--- parse.h 23 Feb 2026 10:27:49 -0000 1.18
+++ parse.h 3 Sep 2026 05:51:33 -0000
@@ -94,6 +94,7 @@ struct authority_c *authority_find0(stru
struct domain_c *domain_find_handle(struct acme_conf *, char *);
int domain_valid(const char *);
+int altname_domain_valid(const char *);
const char *ip_valid(const char *);
#endif /* PARSE_H */
Index: parse.y
===================================================================
RCS file: /cvs/src/usr.sbin/acme-client/parse.y,v
diff -u -p -r1.48 parse.y
--- parse.y 23 Feb 2026 10:27:49 -0000 1.48
+++ parse.y 3 Sep 2026 05:51:33 -0000
@@ -454,7 +454,7 @@ altname : STRING {
if ((s = strdup(ip)) == NULL)
err(EXIT_FAILURE, "strdup");
} else {
- if (!domain_valid($1)) {
+ if (!altname_domain_valid($1)) {
yyerror("bad domain name syntax");
YYERROR;
}
@@ -775,7 +775,7 @@ nodigits:
x != '!' && x != '=' && x != '#' && \
x != ','))
- if (isalnum(c) || c == ':' || c == '_') {
+ if (isalnum(c) || c == ':' || c == '_' || c == '*') {
do {
*p++ = c;
if ((size_t)(p-buf) >= sizeof(buf)) {
@@ -1161,6 +1161,15 @@ domain_valid(const char *cp)
*cp == '_' || isalnum((unsigned char)*cp)))
return 0;
return 1;
+}
+
+int
+altname_domain_valid(const char *cp)
+{
+ if (cp[0] == '*' && cp[1] == '.')
+ cp += 2;
+
+ return domain_valid(cp);
}
const char *
allow wildcard altnames in acme-client.conf