Proxy to secure ACME DNS challenges.
Most DNS providers do not offer a way to restrict access only to TXT records or to a specific domain. DigitalOcean for example only offers API tokens with full cloud access.
This creates a security issue if you use multipe host with acme.sh or lego, for example, because you have to distribute your API key among the host.
With ACME DNS Proxy you can control which client has access to which domains without storing your DNS Provider API keys on the client.
- Restrict ACME client access to specified (sub)domains
- CertMagic or self signed certificate for the proxy itself (TODO)
- Monitoring endpoint (prometheus) (TODO)
- "auto cleanup" DNS records (TODO)
- acmesh-official/acme.sh with dns_acmeproxy
- go-acme/lego with httpreq
- traefik/traefik which uses go-acme/lego
- Everything else that can send a HTTP request
The configuration consists of three main parts. server, provider and access
Under server you can configure common stuff like TLS and the address, the server listens to.
server:
addr: ":8080"The provider section configures the access to your DNS provider.
provider:
type: gcloud
variables:
GCE_PROJECT: some-project
GCE_SERVICE_ACCOUNT: some-service-account
GCE_SERVICE_ACCOUNT_FILE: /some-service-account-file.jsontype:
type specifies the DNS provider.
acme-dns-proxy uses libdns/libdns to add and remove DNS records. Please see the list of Supported Providers section for further information.
All providers support
variables:
Which variables are available depends on the type.
Please see the list Supported Providers section for further information.
The access_rules section specifies the domains for which a client can request a certificate.
access_rules:
- pattern: "*.a.b.c.matthiasng.com"
token: f9e5f6a00056b7913fea130aa31921ccae1b4cb152a12999d7751e667c016344
- pattern: matthiasng.com
token: f97b0d33302f348adf6ed887961156cc11b2436fd4699e7aa759becd8d96c7e3
- pattern: "x.y.matthiasng.com"
token: f71876a55b38a12a5da6ec1900a5cf09c7a06574726d42b3295614cc7f20b344pattern:
A glob pattern that must match the domain a client is allowed to verify.
matthiasng.com: only allowmatthiasng.com*.sub.matthiasng.com: allow all subdomains but notsub.matthiasng.com*foo.matthiasng.com: all subdomains, the current domain, and each subdomain ofmatthiasng.comstarting with*foo
token:
A token to verify the request.
For acme.sh and lego this must be the SHA 256 value of <username>:<password>.
This way we dont need an extra client plugin and you can integrate the proxy inside existing infrastructure easily.
echo -n <user>:<password> | sha256sumThe configration file supports golang's template. The following variables are available:
Env
Contains all environment variables. \provider: type: hetzner variables: AuthAPIToken: {{ .Env.HETZNER_AUTH_API_TOKEN }}
- https://github.com/rmbolger/Posh-ACME/wiki/List-of-Supported-DNS-Providers
- multiple providers