===== 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 registrar 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