This is an old revision of the document!
Cloudflare DNS-01 challenge
Brief notes on how to setup a lets encrypt cert bot using Cloudflare as dns provider.
Configure DNS at domain registrar
- At the domain name registrar, configure the domain to use Cloudflare's nameservers.
- Example: at GoDaddy this setting is called use custom name servers.
Create an API Token
- Login to https://dash.cloudflare.com/
- Register an account unless you already have one.
- Keep any credentials in a safe place.
- Click on My Profile → API Tokens.
- Select Create Token.
- Use the Edit zone DNS template or create a custom token.
- Give the token a descriptive name, so you can identify and revoke it if necessary.
- Select the desired expiration.
- Suggestion: use No expiration to avoid maintenance overhead.
- Under Permissions, allow Zone → DNS → Edit.
- Under Zone Resources, select the specific zone (domain) or all zones.
- Click Continue to Summary → Create Token.
- Copy the token string and keep it in a very safe place.
- You will not be able to view it again.
- If this token becomes public, someone could modify your DNS records.
Setup the certbot
Install certbot
- Make sure your server has internet access (required for DNS-01 challenge).
- Ensure the snap version of certbot is installed and configured:
sudo snap install --classic certbot sudo snap set certbot trust-plugin-with-root=ok
Install Cloudflare Plugin
- Install the Cloudflare plugin:
sudo snap install certbot-dns-cloudflare
Create credentials file
- Create the file:
sudo nano /etc/letsencrypt/cloudflare.ini
- Paste this line (replace with your API token):
dns_cloudflare_api_token = PASTE_TOKEN_HERE
- In nano: use Ctrl+O to write, then Ctrl+X to exit.
Secure credentials file
- Change ownership of the file:
sudo chown root:root /etc/letsencrypt/cloudflare.ini
- Restrict permissions:
sudo chmod 600 /etc/letsencrypt/cloudflare.ini
Activate certbot
Request certificate
- Replace example.com and int.example.com (add/remove domains as needed).
- Wildcards are supported, e.g. `*.example.com`.
- Use the domain owner's email.
sudo certbot certonly --dns-cloudflare \ --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \ -d example.com -d int.example.com \ --agree-tos --email you@example.com --non-interactive
Test renewal
- Test renewal with a dry run:
sudo certbot renew --dry-run
Avoid renewing certificates without the dry run flag as Let's encrypt has a cap of renewals/day.
Reload nginx
- If successful, check nginx config and reload:
sudo nginx -t && sudo systemctl reload nginx