Configuration: DNS providers

DNS providers are used by the tls-acme module to solve the DNS-01 ACME challenge — the only challenge type that supports wildcard certificates. You configure a provider inside the dns { } block nested within a tls { } block, selecting it by name with the provider directive.

*.example.com {
    tls {
        provider acme
        challenge dns-01
        contact "admin@example.com"
        dns {
            provider cloudflare
            api_key "{{env.CF_API_TOKEN}}"
            # provider-specific directives...
        }
    }
}

All DNS provider implementations are currently part of the dns-stalwart module.

Providers

Alibaba Cloud DNS

Provider name: alidns

DirectiveArgumentsDescriptionDefault
access_key_id<string>Alibaba Cloud AccessKey ID.— (required)
access_key_secret<string>Alibaba Cloud AccessKey secret.— (required)
region<string>Alibaba Cloud region.— (optional)
security_token<string>STS security token for temporary credentials.— (optional)
line<string>DNS line/zone identifier.— (optional)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider alidns
            access_key_id "YOUR_ALIBABA_ACCESS_KEY_ID"
            access_key_secret "YOUR_ALIBABA_ACCESS_KEY_SECRET"
            region "cn-hangzhou"
        }
    }
}

ArvanCloud

Provider name: arvancloud

DirectiveArgumentsDescriptionDefault
api_key<string>ArvanCloud API key.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider arvancloud
            api_key "YOUR_ARVANCLOUD_API_KEY"
        }
    }
}

AutoDNS

Provider name: autodns

DirectiveArgumentsDescriptionDefault
username<string>AutoDNS username.— (required)
password<string>AutoDNS password.— (required)
context<number>AutoDNS context ID.— (optional)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider autodns
            username "YOUR_AUTODNS_USERNAME"
            password "YOUR_AUTODNS_PASSWORD"
        }
    }
}

Azure DNS

Provider name: azuredns

DirectiveArgumentsDescriptionDefault
tenant_id<string>Azure tenant ID.— (required)
client_id<string>Azure client/application ID.— (required)
client_secret<string>Azure client secret.— (required)
subscription_id<string>Azure subscription ID.— (required)
resource_group<string>Azure resource group name.— (required)
endpointAzurePublicCloud, AzureChinaCloud, AzureUSGovernmentAzure environment.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider azuredns
            tenant_id "YOUR_TENANT_ID"
            client_id "YOUR_CLIENT_ID"
            client_secret "YOUR_CLIENT_SECRET"
            subscription_id "YOUR_SUBSCRIPTION_ID"
            resource_group "example-rg"
            endpoint "AzurePublicCloud"
        }
    }
}

Baidu Cloud DNS

Provider name: baiducloud

DirectiveArgumentsDescriptionDefault
access_key_id<string>Baidu Cloud AccessKey ID.— (required)
access_key_secret<string>Baidu Cloud AccessKey secret.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider baiducloud
            access_key_id "YOUR_BAIDU_ACCESS_KEY_ID"
            access_key_secret "YOUR_BAIDU_ACCESS_KEY_SECRET"
        }
    }
}

BlueCat Address Manager v2

Provider name: bluecatv2

Updates DNS records on BlueCat Address Manager v2 via its REST API.

DirectiveArgumentsDescriptionDefault
server_url<string>BlueCat gateway URL.— (required)
username<string>BlueCat username.— (required)
password<string>BlueCat password.— (required)
config_name<string>BlueCat configuration name.— (required)
view_name<string>DNS view name.— (required)
skip_deploy<bool>Skip the deployment step after updating records.false

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider bluecatv2
            server_url "https://bluecat.example.com:8443/gateway-api"
            username "YOUR_BLUECAT_USERNAME"
            password "YOUR_BLUECAT_PASSWORD"
            config_name "production"
            view_name "external"
        }
    }
}

Bunny

Provider name: bunny

DirectiveArgumentsDescriptionDefault
api_key<string>Bunny DNS API key.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider bunny
            api_key "YOUR_BUNNY_API_KEY"
        }
    }
}

ClouDNS

Provider name: cloudns

DirectiveArgumentsDescriptionDefault
auth_id<string>ClouDNS Auth ID.— (optional)
sub_auth_id<string>ClouDNS sub-auth ID.— (optional)
password<string>ClouDNS password (required if auth_id/sub_auth_id not used).— (optional)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider cloudns
            auth_id "YOUR_CLOUDNS_AUTH_ID"
            password "YOUR_CLOUDNS_PASSWORD"
        }
    }
}

Constellix

Provider name: constellix

DirectiveArgumentsDescriptionDefault
api_key<string>Constellix API key.— (required)
secret_key<string>Constellix secret key.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider constellix
            api_key "YOUR_CONSTELLIX_API_KEY"
            secret_key "YOUR_CONSTELLIX_SECRET_KEY"
        }
    }
}

cPanel

Provider name: cpanel

DirectiveArgumentsDescriptionDefault
base_url<string>cPanel host URL (e.g. https://example.com:2083).— (required)
username<string>cPanel account username.— (required)
token<string>cPanel API token.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider cpanel
            base_url "https://example.com:2083"
            username "YOUR_CPNL_USERNAME"
            token "YOUR_CPNL_API_TOKEN"
        }
    }
}

Cloudflare

Provider name: cloudflare

DirectiveArgumentsDescriptionDefault
api_key<string>Cloudflare API token (scoped token).— (required)

Configuration example:

*.example.com {
    # Scoped API token (recommended)
    tls {
        provider acme
        challenge dns-01

        dns {
            provider cloudflare
            api_key "YOUR_CLOUDFLARE_API_TOKEN"
        }
    }
}

DDNSS.de

Provider name: ddnss

DirectiveArgumentsDescriptionDefault
key<string>DDNSS.de API key.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider ddnss
            key "YOUR_DDNSS_API_KEY"
        }
    }
}

deSEC

Provider name: desec

DirectiveArgumentsDescriptionDefault
auth_token<string>deSEC API token.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider desec
            auth_token "YOUR_DESEC_API_TOKEN"
        }
    }
}

DigitalOcean

Provider name: digitalocean

DirectiveArgumentsDescriptionDefault
auth_token<string>DigitalOcean personal access token (OAuth token).— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider digitalocean
            auth_token "YOUR_DO_OAUTH_TOKEN"
        }
    }
}

DNS Made Easy

Provider name: dnsmadeeasy

DirectiveArgumentsDescriptionDefault
api_key<string>DNS Made Easy API key.— (required)
api_secret<string>DNS Made Easy API secret.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider dnsmadeeasy
            api_key "YOUR_DNSMADEEASY_API_KEY"
            api_secret "YOUR_DNSMADEEASY_API_SECRET"
        }
    }
}

DNSimple

Provider name: dnsimple

DirectiveArgumentsDescriptionDefault
oauth_token<string>DNSimple OAuth token.— (required)
account_id<string>DNSimple account ID.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider dnsimple
            oauth_token "YOUR_DNSIMPLE_TOKEN"
            account_id "12345"
        }
    }
}

Domeneshop

Provider name: domeneshop

DirectiveArgumentsDescriptionDefault
api_token<string>Domeneshop API token.— (required)
api_secret<string>Domeneshop API secret.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider domeneshop
            api_token "YOUR_DOMENESHOP_API_TOKEN"
            api_secret "YOUR_DOMENESHOP_API_SECRET"
        }
    }
}

DreamHost

Provider name: dreamhost

DirectiveArgumentsDescriptionDefault
api_key<string>DreamHost API key.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider dreamhost
            api_key "YOUR_DREAMHOST_API_KEY"
        }
    }
}

DuckDNS

Provider name: duckdns

DirectiveArgumentsDescriptionDefault
token<string>DuckDNS account token.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider duckdns
            token "YOUR_DUCKDNS_TOKEN"
        }
    }
}

Dynu

Provider name: dynu

DirectiveArgumentsDescriptionDefault
api_key<string>Dynu API key.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider dynu
            api_key "YOUR_DYNU_API_KEY"
        }
    }
}

EasyDNS

Provider name: easydns

DirectiveArgumentsDescriptionDefault
token<string>EasyDNS API token.— (required)
key<string>EasyDNS API key.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider easydns
            token "YOUR_EASYDNS_TOKEN"
            key "YOUR_EASYDNS_API_KEY"
        }
    }
}

Akamai Edge DNS

Provider name: edgedns

DirectiveArgumentsDescriptionDefault
host<string>Edge DNS server hostname.— (required)
client_token<string>Edge DNS client token.— (required)
client_secret<string>Edge DNS client secret.— (required)
access_token<string>Edge DNS access token.— (required)
account_switch_key<string>Account switch key for multi-account setups.— (optional)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider edgedns
            host "edgeapi.akamai.com"
            client_token "YOUR_CLIENT_TOKEN"
            client_secret "YOUR_CLIENT_SECRET"
            access_token "YOUR_ACCESS_TOKEN"
        }
    }
}

Exoscale

Provider name: exoscale

DirectiveArgumentsDescriptionDefault
api_key<string>Exoscale API key.— (required)
api_secret<string>Exoscale API secret.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider exoscale
            api_key "YOUR_EXOSCALE_API_KEY"
            api_secret "YOUR_EXOSCALE_API_SECRET"
        }
    }
}

FreeMyIP

Provider name: freemyip

DirectiveArgumentsDescriptionDefault
token<string>FreeMyIP token.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider freemyip
            token "YOUR_FREEMYIP_TOKEN"
        }
    }
}

Gandi v5

Provider name: gandiv5

DirectiveArgumentsDescriptionDefault
personal_access_token<string>Gandi v5 personal access token.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider gandiv5
            personal_access_token "YOUR_GANDI_PAT"
        }
    }
}

Gcore

Provider name: gcore

DirectiveArgumentsDescriptionDefault
api_token<string>Gcore API token.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider gcore
            api_token "YOUR_GCORE_API_TOKEN"
        }
    }
}

GleSYS

Provider name: glesys

DirectiveArgumentsDescriptionDefault
api_user<string>GleSYS API username.— (required)
api_key<string>GleSYS API key.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider glesys
            api_user "YOUR_GLESYS_API_USER"
            api_key "YOUR_GLESYS_API_KEY"
        }
    }
}

GoDaddy

Provider name: godaddy

DirectiveArgumentsDescriptionDefault
api_key<string>GoDaddy API key.— (required)
api_secret<string>GoDaddy API secret.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider godaddy
            api_key "YOUR_GODADDY_API_KEY"
            api_secret "YOUR_GODADDY_API_SECRET"
        }
    }
}

Google Cloud DNS

Provider name: googlecloud

DirectiveArgumentsDescriptionDefault
service_account_json<string>Contents of the Google Cloud service account JSON key file.— (required)
project_id<string>Google Cloud project ID.— (required)
managed_zone<string>Name of the Cloud DNS managed zone. Ferron resolves the zone automatically if omitted.— (optional)
private_zone<bool>Set to true to target a private zone.false
impersonate_service_account<string>Service account email to impersonate.— (optional)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider googlecloud
            service_account_json "{\"type\":\"service_account\", ...}"
            project_id "my-gcp-project"
            managed_zone "example-com"
        }
    }
}

Hetzner DNS

Provider name: hetzner

DirectiveArgumentsDescriptionDefault
api_token<string>Hetzner DNS API token.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider hetzner
            api_token "YOUR_HETZNER_API_TOKEN"
        }
    }
}

hosting.de

Provider name: hostingde

DirectiveArgumentsDescriptionDefault
api_key<string>Hosting.de API key.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider hostingde
            api_key "YOUR_HOSTINGDE_API_KEY"
        }
    }
}

Hostinger

Provider name: hostinger

DirectiveArgumentsDescriptionDefault
api_token<string>Hostinger API token.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider hostinger
            api_token "YOUR_HOSTINGER_API_TOKEN"
        }
    }
}

Huawei Cloud DNS

Provider name: huaweicloud

DirectiveArgumentsDescriptionDefault
access_key_id<string>Huawei Cloud AccessKey ID.— (required)
access_key_secret<string>Huawei Cloud AccessKey secret.— (required)
region<string>Huawei Cloud region.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider huaweicloud
            access_key_id "YOUR_HUAWEI_ACCESS_KEY_ID"
            access_key_secret "YOUR_HUAWEI_ACCESS_KEY_SECRET"
            region "cn-north-1"
        }
    }
}

Hurricane Electric

Provider name: hurricane

DirectiveArgumentsDescriptionDefault
credentials<string>Comma-separated key=value pairs (e.g. domain1=ip1,domain2=ip2).— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider hurricane
            credentials "example.com=192.0.2.1,mail.example.com=192.0.2.2"
        }
    }
}

IBM Cloud

Provider name: ibmcloud

DirectiveArgumentsDescriptionDefault
username<string>IBM Cloud username.— (required)
api_key<string>IBM Cloud API key.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider ibmcloud
            username "YOUR_IBM_USERNAME"
            api_key "YOUR_IBM_API_KEY"
        }
    }
}

Infoblox NIOS

Provider name: infoblox

Updates DNS records on Infoblox NIOS via its WAPI REST API.

DirectiveArgumentsDescriptionDefault
host<string>Infoblox NIOS server hostname.— (required)
username<string>Infoblox username.— (required)
password<string>Infoblox password.— (required)
port<string>Infoblox WAPI port.— (optional)
wapi_version<string>WAPI API version.— (optional)
dns_view<string>DNS view name.— (optional)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider infoblox
            host "infoblox.example.com"
            username "YOUR_INFOBLOX_USERNAME"
            password "YOUR_INFOBLOX_PASSWORD"
            wapi_version "2.11"
            dns_view "default"
        }
    }
}

Infomaniak

Provider name: infomaniak

DirectiveArgumentsDescriptionDefault
api_token<string>Infomaniak API token.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider infomaniak
            api_token "YOUR_INFOMANIAK_API_TOKEN"
        }
    }
}

INWX

Provider name: inwx

DirectiveArgumentsDescriptionDefault
username<string>INWX username.— (required)
password<string>INWX password.— (required)
sandbox<bool>Use sandbox environment.false

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider inwx
            username "YOUR_INWX_USERNAME"
            password "YOUR_INWX_PASSWORD"
            sandbox "false"
        }
    }
}

IONOS

Provider name: ionos

DirectiveArgumentsDescriptionDefault
api_key<string>IONOS API key.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider ionos
            api_key "YOUR_IONOS_API_KEY"
        }
    }
}

IPv64

Provider name: ipv64

DirectiveArgumentsDescriptionDefault
api_key<string>IPv64 API key.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider ipv64
            api_key "YOUR_IPV64_API_KEY"
        }
    }
}

Joker

Provider name: joker

DirectiveArgumentsDescriptionDefault
api_key<string>Joker API key (alternative to username/password).— (optional)
username<string>Joker username (alternative to api_key).— (optional)
password<string>Joker password (alternative to api_key).— (optional)
Note

Either api_key or the pair username + password is required.

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider joker
            api_key "YOUR_JOKER_API_KEY"
        }
    }
}

AWS Lightsail

Provider name: lightsail

DirectiveArgumentsDescriptionDefault
access_key_id<string>AWS AccessKey ID.— (required)
secret_access_key<string>AWS SecretAccessKey.— (required)
region<string>AWS region.— (optional)
session_token<string>AWS session token (STS).— (optional)
domain<string>Domain name filter.— (optional)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider lightsail
            access_key_id "YOUR_LIGHTSAIL_ACCESS_KEY_ID"
            secret_access_key "YOUR_LIGHTSAIL_SECRET_ACCESS_KEY"
            region "us-east-1"
            domain "example.com"
        }
    }
}

Linode

Provider name: linode

DirectiveArgumentsDescriptionDefault
api_token<string>Linode API v4 token.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider linode
            api_token "YOUR_LINODE_API_TOKEN"
        }
    }
}

LuaDNS

Provider name: luadns

DirectiveArgumentsDescriptionDefault
api_username<string>LuaDNS API username.— (required)
api_token<string>LuaDNS API token.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider luadns
            api_username "YOUR_LUADNS_API_USERNAME"
            api_token "YOUR_LUADNS_API_TOKEN"
        }
    }
}

Mythic Beasts

Provider name: mythicbeasts

DirectiveArgumentsDescriptionDefault
username<string>Mythic Beasts username.— (required)
password<string>Mythic Beasts password.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider mythicbeasts
            username "YOUR_MYTHIC_USERNAME"
            password "YOUR_MYTHIC_PASSWORD"
        }
    }
}

Namecheap

Provider name: namecheap

DirectiveArgumentsDescriptionDefault
api_key<string>Namecheap API key.— (required)
api_secret<string>Namecheap API secret.— (required)
client_ip<string>Client IP address (used for API access control / IP restriction).— (required)
username<string>Namecheap username.— (optional)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider namecheap
            api_key "YOUR_NAMECHEAP_API_KEY"
            api_secret "YOUR_NAMECHEAP_API_SECRET"
            client_ip "YOUR_CLIENT_IP"
        }
    }
}

Name.com

Provider name: namedotcom

DirectiveArgumentsDescriptionDefault
username<string>Name.com username.— (required)
api_token<string>Name.com API token.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider namedotcom
            username "YOUR_NAMEDOTCOM_USERNAME"
            api_token "YOUR_NAMEDOTCOM_API_TOKEN"
        }
    }
}

NameSilo

Provider name: namesilo

DirectiveArgumentsDescriptionDefault
api_token<string>NameSilo API token.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider namesilo
            api_token "YOUR_NAMESILO_API_TOKEN"
        }
    }
}

netcup

Provider name: netcup

DirectiveArgumentsDescriptionDefault
customer_number<string>Netcup customer number.— (required)
api_key<string>Netcup API key.— (required)
api_password<string>Netcup API password.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider netcup
            customer_number "YOUR_NETCUP_CUSTOMER_NUMBER"
            api_key "YOUR_NETCUP_API_KEY"
            api_password "YOUR_NETCUP_API_PASSWORD"
        }
    }
}

Netlify

Provider name: netlify

DirectiveArgumentsDescriptionDefault
access_token<string>Netlify access token.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider netlify
            access_token "YOUR_NETLIFY_ACCESS_TOKEN"
        }
    }
}

Nifcloud

Provider name: nifcloud

DirectiveArgumentsDescriptionDefault
api_key<string>Nifty Cloud API key.— (required)
api_secret<string>Nifty Cloud API secret.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider nifcloud
            api_key "YOUR_NIFCLOUD_API_KEY"
            api_secret "YOUR_NIFCLOUD_API_SECRET"
        }
    }
}

NS1

Provider name: ns1

DirectiveArgumentsDescriptionDefault
api_key<string>NS1 API key.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider ns1
            api_key "YOUR_NS1_API_KEY"
        }
    }
}

Oracle Cloud DNS

Provider name: oraclecloud

DirectiveArgumentsDescriptionDefault
tenancy_ocid<string>Oracle tenancy OCID.— (required)
user_ocid<string>Oracle user OCID.— (required)
compartment_ocid<string>Oracle compartment OCID.— (required)
region<string>Oracle Cloud region.— (required)
fingerprint<string>API fingerprint.— (required)
private_key_pem<string>Private key in PEM format.— (required)
private_key_password<string>Private key password (if encrypted).— (optional)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider oraclecloud
            tenancy_ocid "ocid1.tenancy.oc1..example"
            user_ocid "ocid1.user.oc1..example"
            compartment_ocid "ocid1.compartment.oc1..example"
            region "us-phoenix-1"
            fingerprint "YOUR_FINGERPRINT"
            private_key_pem "-----BEGIN PRIVATE KEY-----\n..."
        }
    }
}

OVH

Provider name: ovh

DirectiveArgumentsDescriptionDefault
application_key<string>OVH application key.— (required)
application_secret<string>OVH application secret.— (required)
consumer_key<string>OVH consumer key.— (required)
endpointovh-eu, ovh-ca, kimsufi-eu, kimsufi-ca, soyoustart-eu, soyoustart-caOVH API endpoint region.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider ovh
            application_key "YOUR_APP_KEY"
            application_secret "YOUR_APP_SECRET"
            consumer_key "YOUR_CONSUMER_KEY"
            endpoint "ovh-eu"
        }
    }
}

Plesk

Provider name: plesk

DirectiveArgumentsDescriptionDefault
base_url<string>Plesk server URL.— (required)
api_key<string>Plesk API key.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider plesk
            base_url "https://plesk.example.com:8443"
            api_key "YOUR_PLESK_API_KEY"
        }
    }
}

Porkbun

Provider name: porkbun

DirectiveArgumentsDescriptionDefault
api_key<string>Porkbun API key.— (required)
secret_key<string>Porkbun secret API key.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider porkbun
            api_key "YOUR_PORKBUN_API_KEY"
            secret_key "YOUR_PORKBUN_SECRET_KEY"
        }
    }
}

RFC 2136 (TSIG)

Provider name: rfc2136

Updates DNS records on any authoritative server that supports dynamic updates (RFC 2136) authenticated with TSIG.

DirectiveArgumentsDescriptionDefault
server<uri>DNS server address as a URI with scheme tcp or udp (e.g. udp://ns1.example.com:53).— (required)
key_name<string>TSIG key name.— (required)
key_secret<string>TSIG key secret, Base64-encoded.— (required)
key_algorithmHMAC-MD5, GSS, HMAC-SHA1, HMAC-SHA224, HMAC-SHA256, HMAC-SHA256-128, HMAC-SHA384, HMAC-SHA384-192, HMAC-SHA512, HMAC-SHA512-256TSIG algorithm.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider rfc2136
            server "udp://ns1.example.com:53"
            key_name "ferron-acme."
            key_secret "BASE64_ENCODED_TSIG_SECRET"
            key_algorithm "HMAC-SHA256"
        }
    }
}

Route 53

Provider name: route53

DirectiveArgumentsDescriptionDefault
access_key_id<string>AWS access key ID.— (required)
secret_access_key<string>AWS secret access key.— (required)
region<string>AWS region (e.g. us-east-1).— (optional)
session_token<string>AWS session token for temporary credentials.— (optional)
hosted_zone_id<string>Route 53 hosted zone ID. Ferron resolves the zone automatically if omitted.— (optional)
private_zone_only<bool>Set to true to target a private hosted zone only.false

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider route53
            access_key_id "AKIAIOSFODNN7EXAMPLE"
            secret_access_key "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
            region "us-east-1"
            hosted_zone_id "Z1D633PJN98FT9"
        }
    }
}

ANS SafeDNS

Provider name: safedns

DirectiveArgumentsDescriptionDefault
auth_token<string>SafeDNS authentication token.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider safedns
            auth_token "YOUR_SAFEDNS_AUTH_TOKEN"
        }
    }
}

Scaleway

Provider name: scaleway

DirectiveArgumentsDescriptionDefault
api_token<string>Scaleway API token.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider scaleway
            api_token "YOUR_SCALEWAY_API_TOKEN"
        }
    }
}

Spaceship

Provider name: spaceship

DirectiveArgumentsDescriptionDefault
api_key<string>Spaceship API key.— (required)
api_secret<string>Spaceship API secret.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider spaceship
            api_key "YOUR_SPACESHIP_API_KEY"
            api_secret "YOUR_SPACESHIP_API_SECRET"
        }
    }
}

Tencent Cloud DNSPod

Provider name: tencentcloud

DirectiveArgumentsDescriptionDefault
secret_id<string>Tencent Cloud SecretId.— (required)
secret_key<string>Tencent Cloud SecretKey.— (required)
region<string>Tencent Cloud region.— (optional)
session_token<string>Temporary session token.— (optional)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider tencentcloud
            secret_id "YOUR_TENCENT_SECRET_ID"
            secret_key "YOUR_TENCENT_SECRET_KEY"
            region "ap-guangzhou"
        }
    }
}

TransIP

Provider name: transip

DirectiveArgumentsDescriptionDefault
login<string>TransIP account login.— (required)
private_key_pem<string>Private key in PEM format.— (required)
global_key<boolean>Use global key for authentication.false

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider transip
            login "YOUR_TRANSIP_LOGIN"
            private_key_pem "-----BEGIN PRIVATE KEY-----\n..."
            global_key true
        }
    }
}

UltraDNS

Provider name: ultradns

DirectiveArgumentsDescriptionDefault
username<string>UltraDNS username.— (required)
password<string>UltraDNS password.— (required)
endpoint<string>Custom endpoint URL.— (optional)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider ultradns
            username "YOUR_ULTRADNS_USERNAME"
            password "YOUR_ULTRADNS_PASSWORD"
        }
    }
}

Vercel

Provider name: vercel

DirectiveArgumentsDescriptionDefault
auth_token<string>Vercel auth token.— (required)
team_id<string>Team ID for team-managed DNS.— (optional)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider vercel
            auth_token "YOUR_VERCEL_AUTH_TOKEN"
        }
    }
}

Vultr

Provider name: vultr

DirectiveArgumentsDescriptionDefault
api_key<string>Vultr API key.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider vultr
            api_key "YOUR_VULTR_API_KEY"
        }
    }
}

Websupport

Provider name: websupport

DirectiveArgumentsDescriptionDefault
api_key<string>WebSupport API key.— (required)
secret<string>WebSupport secret.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider websupport
            api_key "YOUR_WEBSUPPORT_API_KEY"
            secret "YOUR_WEBSUPPORT_SECRET"
        }
    }
}

Volcano Engine

Provider name: volcengine

DirectiveArgumentsDescriptionDefault
access_key<string>Volcengine AccessKey.— (required)
secret_key<string>Volcengine SecretKey.— (required)
region<string>Volcengine region.— (optional)
host<string>Custom API host.— (optional)
schemehttp, httpsHTTP scheme.— (optional)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider volcengine
            access_key "YOUR_VOLCENGINE_ACCESS_KEY"
            secret_key "YOUR_VOLCENGINE_SECRET_KEY"
            region "cn-beijing"
        }
    }
}

Yandex Cloud DNS

Provider name: yandexcloud

DirectiveArgumentsDescriptionDefault
iam_token_b64<string>IAM token (base64-encoded).— (required)
folder_id<string>Yandex folder ID.— (required)

Configuration example:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider yandexcloud
            iam_token_b64 "YOUR_IAM_TOKEN_B64"
            folder_id "YOUR_FOLDER_ID"
        }
    }
}

Usage notes

Using environment variables for credentials

All string directives support environment variable interpolation. This avoids storing secrets directly in your configuration file:

*.example.com {
    tls {
        provider acme
        challenge dns-01

        dns {
            provider cloudflare
            api_key "{{env.CF_API_TOKEN}}"
        }
    }
}

DNS propagation delays

After Ferron creates the _acme-challenge TXT record, the ACME CA must be able to resolve it. Propagation time varies by provider:

ProviderTypical minimum TTL
bluecatv2, exoscale, ns1, yandexcloud0 s
rfc2136, azuredns, gcore, huaweicloud, route531 s
bunny15 s
constellix, dnsmadeeasy, dynu, digitalocean, infoblox, oraclecloud30 s
cloudflare, dnsimple, googlecloud, ovh, spaceship, arvancloud, cloudns, dreamhost, duckdns, freemyip, glesys, hetzner, hostingde, ibmcloud, infomaniak, ionos, ipv64, lightsail, luadns, mythicbeasts, namecheap, namesilo, netcup, netlify, nifcloud, scaleway, ultradns, vercel, vultr, volcengine60 s (1 min)
autodns, cpanel, domeneshop, easydns, gandiv5, hostinger, hurricane, inwx, joker, linode, plesk, safedns, websupport, baiducloud, transip300 s (5 min)
alidns, godaddy, namedotcom, tencentcloud, porkbun600 s (10 min)
ddnss900 s (15 min)
desec3600 s (1 h)

If certificate issuance fails with a DNS validation error, verify that the TXT record is resolvable from the public internet before retrying.

RFC 2136 TSIG key format

The key_secret value must be the raw TSIG key bytes encoded as standard Base64 (with padding). Most DNS management tools (BIND tsig-keygen, dnssec-keygen) output the key in this format already.

Azure endpoint selection

Choose the endpoint that matches where your DNS zone is hosted:

ValueRegion
AzurePublicCloudAzure (default)
AzureChinaCloudAzure China
AzureUSGovernmentAzure Government

OVH endpoint selection

Choose the endpoint that matches where your domain is registered:

ValueRegion
ovh-euOVH Europe
ovh-caOVH North America / Canada
kimsufi-euKimsufi Europe
kimsufi-caKimsufi North America
soyoustart-euSo you Start Europe
soyoustart-caSo you Start North America

See also

Best practices

The following best-practice check is reported by ferron doctor for DNS provider directives.

  • Secrets in plain configuration — DNS provider credentials (api_key, secret, token, etc.) should use environment variable interpolation ({{env.VAR}}) rather than plain strings to avoid leaking secrets in version control or logs.