eskimo 3d606b20bc v3.0.1: default propagation 20s -> 60s for edge-replica convergence
20s was too tight: yeil serves DNS from edge replicas fed by a
replication log, so a freshly-written _acme-challenge TXT takes a bit to
appear on every authoritative nameserver. Let's Encrypt's secondary
(multi-perspective) validation hit a not-yet-converged replica and saw a
stale value -> 'incorrect TXT record found'. 60s lets all replicas catch
up (matches what already works in practice for wildcard certs).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 02:14:48 -04:00

certbot-dns-yeil

yeil DNS Authenticator plugin for Certbot.

Authenticates to dns.yeil.app's public API with a yeil App key (yk_...) sent as a Bearer token, then adds/removes TXT records to satisfy ACME DNS-01 challenges. Works for any yeil team with an App that has DNS record-write permission; the certbot host just needs HTTPS reachability to dns.yeil.app.

Wildcard certs require DNS-01, so this plugin (or another DNS authenticator) is needed for *.example.com.

Installation

pip install git+https://git.eskimo.dev/Yeil/certbot-dns-yeil.git

Configuration

In your yeil team settings, open Apps, create an App, grant it DNS record-write permission on the zone(s) you'll issue certs for, and mint a key. Drop the key (yk_...) into a credentials INI:

dns_yeil_api_key = yk_xxxxxxxx_yyyyyyyyyyyyyyyyyyyyyyyy

chmod 600 it.

Migrating from 2.x: the old dns_yeil_email / dns_yeil_app_password login was retired with personal app passwords. Replace those two lines with a single dns_yeil_api_key.

Optional override if you're testing against a non-production host:

dns_yeil_base_url = https://dns.staging.example

Usage

certbot certonly \
  --authenticator dns-yeil \
  --dns-yeil-credentials /etc/letsencrypt/yeil.ini \
  -d smtp.yeil.org \
  --preferred-challenges dns

For wildcards:

certbot certonly \
  --authenticator dns-yeil \
  --dns-yeil-credentials /etc/letsencrypt/yeil.ini \
  -d yeil.org -d '*.yeil.org'

How it works

The plugin sends the App key as a Bearer token on every request. For each requested name it asks the API which of the App's zones covers the FQDN (GET /api/v1/zones?suffix_of=<fqdn>), creates a TXT at _acme-challenge.<rel> (POST /api/v1/zones/{id}/records), waits for propagation, and on cleanup deletes the record by id (DELETE /api/v1/zones/{id}/records/{recordId}).

Revoking the App key (or disabling the App) in your team settings cuts off access cleanly. The key only carries the DNS permissions you granted the App, so scope it to record-write on just the zones you need.

Description
No description provided
Readme MIT 56 KiB
Languages
Python 100%