Home Blog Caddy gebruiken voor automatische SSL-certificaten met Cloudflare

Caddy logo

Caddy gebruiken voor automatische SSL-certificaten met Cloudflare

Cloudflare is een zegen en een vloek als het gaat om het verzorgen van SSL-certificaten voor je websites en webapplicaties. Cloudflare doet het meeste zware werk en zorgt ervoor dat je beschermd bent tegen aanvallen. Het is echter ook een vloek. Laat het me uitleggen!

Waarom Cloudflare en het genereren van SSL-certificaten een uitdaging zijn

Cloudflare fungeert als een proxy tussen het internet en jouw webserver. Dit is geweldig omdat ze verdacht gedrag kunnen filteren en je webserver kunnen beschermen tegen aanvallen. De aanvaller zal nooit het IP-adres van je server kunnen achterhalen, omdat dit verborgen wordt gehouden door Cloudflare.

Dit is echter ook een probleem. Bij het genereren van SSL-certificaten moet de provider kunnen controleren of de server die het certificaat aanvraagt ook echt is wie hij zegt dat hij is. Certbot heeft bijvoorbeeld een externe server nodig om jouw server te bereiken om te verifiëren dat de domeinnaam naar de aanvragende server wijst. Alleen als het dit kan verifiëren, zal het een SSL-certificaat genereren voor dat domein.

Het probleem is dat je Cloudflare nog steeds in het midden van deze interactie hebt. Het verzoek van de externe server zal nooit jouw webserver bereiken, dus het kan niet controleren of de domeinnaam naar jouw server wijst. Je kunt dit omzeilen door de Cloudflare proxy tijdelijk uit te schakelen en deze controle uit te voeren, maar nu ben je niet beschermd. En wat gebeurt er als het tijd is om je certificaat te vernieuwen? Ga je dan elke keer de Cloudflare proxy tijdelijk uitschakelen? Ik denk het niet.

Hoe genereert Caddy SSL-certificaten achter Cloudflare?

Dus ik hoor je vragen: "Zelfs als je Caddy gebruikt om deze SSL-certificaten automatisch te genereren, loop je tegen dezelfde problemen aan". En daar heb je gelijk in. Caddy heeft echter een hele mooie plugin die je kunt installeren die interageert met de Cloudflare API om DNS uitdagingen voor LetsEncrypt op te lossen.

De voordelen hiervan zijn fantastisch, want je krijgt:

  • HTTPS tussen jouw server en Cloudflare EN HTTPS tussen Cloudflare en jouw bezoekers.
  • Nul, ja echt nul, onderhoud als het gaat om SSL-certificaten. Caddy genereert automatisch nieuwe certificaten en je hoeft nooit meer te knoeien met Cloudflare.

Als Caddy zelf je nog niet enthousiast heeft gemaakt over webservers, dan zal de gedachte aan nul onderhoud en geen gedoe met Cloudflare dat wel doen. Laten we eens kijken hoe we dit kunnen integreren.

Hoe de Cloudflare DNS module te integreren in Caddy met Docker

Het docker gedeelte van deze integratie is optioneel, maar ik draai liever al mijn applicaties in containers, inclusief mijn Caddy installatie. Dus je kunt dat deel volgen of overslaan, jouw keuze.

Eerst moeten we caddyserver/xcaddy gebruiken om een aangepaste binary voor Caddy te bouwen. Caddy is geschreven in Go, dus we moeten onze binary compileren om de Cloudflare plugin toe te voegen.

Dat kun je doen met dit commando:

$ xcaddy build \
    --with github.com/caddy-dns/cloudflare

Dit commando maakt een binair bestand aan dat de basisinstallatie van Caddy bevat en voegt de Cloudflare DNS-module toe. In een multi-stage docker image ziet dit er als volgt uit:

FROM caddy:2.6.1-builder AS caddy-builder

RUN xcaddy build \
    --with github.com/caddy-dns/cloudflare

FROM caddy:2.6.1-alpine

COPY --from=caddy-builder /usr/bin/caddy /usr/bin/caddy

De reden dat ik dit in een docker image met meerdere fasen plaats, in plaats van het in 1 fase bloot te leggen, is de uiteindelijke grootte van het image. Het caddy builder image is vrij groot, omdat het alle ontwikkelingssoftware bevat. Je hebt niets hiervan nodig in productie. Alles wat je nodig hebt is de resulterende Go binary in /usr/bin/caddy.

Een van de nadelen is dat het bouwen van je eigen Caddy binary niet het snelste proces is. Gelukkig hoef je dit niet vaak te doen, dus het is een goed idee om je eigen Caddy basisimage te publiceren (het Dockerbestand hierboven) en dat mee te nemen bij het bouwen van je uiteindelijke applicatie.

Als voorbeeld maak ik een basisimage van het Dockerfile hierboven en noem dit: roelofjanelsinga/caddy-cloudflare

Ik kan dit nu als volgt gebruiken voor het hosten van mijn webapp:

FROM php:8.1-cli AS build-env
COPY --chown=www:www . /var/www/html
WORKDIR /var/www/html

# Voer enkele andere bouwstappen uit, zoals "npm run prod" en "composer install".

FROM roelofjanelsinga/caddy-cloudflare:latest

COPY --from=build-env /var/www/html /var/www/html
COPY ./docker/caddy/Caddyfile /etc/caddy/Caddyfile

Nogmaals, dit is een multi-stage build om een zo klein mogelijk image te krijgen. In de tweede stap gebruik ik het aangepaste Caddy image, kopieer ik mijn projectbestanden van de bouwstap naar het uiteindelijke image en voeg ik een aangepast Caddybestand toe met mijn domeinconfiguratie. Deze image kan worden geserveerd en zorgt automatisch voor SSL.

De Cloudflare API Token krijgen

In het aangepaste Caddybestand moeten we een regel toevoegen om Caddy te vertellen dat we Cloudflare willen gebruiken voor onze DNS-uitdagingen. Laat me je eerst een voorbeeld geven van mijn configuratie:

https://mydomain.com {

    root * /var/www/html/public
    encode zstd gzip
    file_server

    tls {
        dns cloudflare {env.CF_API_TOKEN}
        resolvers 1.1.1.1
    }

}

Houd in gedachten dat dit een kale, niet-productie configuratie is. Het is alleen bedoeld om te laten zien hoe dit proces werkt.

In de TLS-configuratie hebben we aangegeven dat Cloudflare moet worden gebruikt voor DNS-uitdagingen en je ziet een omgevingsvariabele voor een Cloudflare API-token.

Laten we eens kijken hoe we dat token kunnen krijgen:

  1. Log in bij Cloudflare en ga naar het domein waarvoor je Caddy wilt inschakelen.
  2. Aan de rechterkant zie je een gedeelte met de kop "API". Klik op "Get your API token": Krijg je API token
  3. Klik onder het blok API-tokens op "Create Token": User API tokens
  4. Scroll op de pagina "User API Tokens" naar beneden en druk op "Get started" in het gedeelte Aangepaste tokens aanmaken: Krijg je API token
  5. Geef je token een beschrijvende naam en voeg 2 rechten toe:
    1. Zone - Zone - Read
    2. Zone - DNS - Edit API Token instellingen
  6. Klik op "Continue to summary" en je zou nu je API-token moeten zien.

De Cloudflare API Token gebruiken met Caddy

Nu je het API token hebt, is de eenvoudigste manier om dit te gebruiken door het op te nemen in je docker-compose instellingen:

Cloudflare API-sleutel in docker-compose

Maar je kunt deze omgevingssleutel leveren op elke manier die voor jou werkt. Nu, nadat je je caddy container hebt opgestart, zul je merken dat het meteen probeert (en slaagt) om DNS uitdagingen uit te voeren via Cloudflare en SSL certificaten te genereren voor je applicatie.

Je hebt nu automatische SSL-certificaten zolang je Caddy gebruikt en je hoeft nooit meer te knoeien met Cloudflare. Best makkelijk, toch?

Gepubliceerd op: September 23rd, 2023

Ik help je met het behalen van geweldige SEO, hogere conversies, en grotere groei van jouw bedrijf

Neem nu contact op om jouw bedrijf te groeien

Roelof Jan Elsinga