Gratis HTTPS-certificaten met Let's Encrypt
Let's Encrypt is een certificeringsinstantie die gratis HTTPS-certificaten voor je domein uitgeeft. Op je VPS krijg je een certificaat met een paar opdrachten via Certbot, of helemaal zonder opdrachten via Caddy, en beide verlengen het vanzelf. Er zijn twee eisen: het domein moet naar het IP-adres van je server wijzen en de poorten 80 en 443 moeten van buitenaf open staan.
Waarom heb je HTTPS nodig?
HTTPS versleutelt het verkeer tussen de browser en de server. Derden op het netwerk kunnen het wachtwoord in een inlogformulier of de gegevens van een bestelling niet lezen. Browsers kunnen op sites zonder HTTPS een waarschuwing "niet veilig" tonen. Een certificaat van Let's Encrypt is gratis, dus er is geen goede reden meer om HTTPS over te slaan.
Voordat je begint
- Het A-record van het domein moet het IP-adres van je server tonen. Controleer dit met
dig +short example.com. De uitvoer moet het IP-adres van je server zijn. - De poorten 80 en 443 moeten open staan, want de validatie gebeurt op poort 80 (HTTP-01). Gebruik je ufw, voer dan
sudo ufw allow 80/tcpensudo ufw allow 443/tcpuit. Heeft je server in het paneel een aparte firewall, controleer dan ook daar de regels. - Heeft het domein een AAAA-record (IPv6), dan moet dat ook naar deze server wijzen. Is dat niet zo, verwijder het record dan.
- Je webserver moet draaien en dit domein kennen.
Installeren en controleren met Certbot op Nginx of Apache
De officiële instructies van Certbot raden het snap-pakket aan. Zorg dat snapd op de server is geïnstalleerd (op Ubuntu meestal wel) en verwijder een oudere Certbot die via apt is geïnstalleerd.
- Installeer Certbot:
sudo snap install --classic certbot - Maak de opdracht overal beschikbaar:
sudo ln -s /snap/bin/certbot /usr/local/bin/certbot - Haal het certificaat op en laat het in de webserver installeren. Voer
sudo certbot --nginxuit voor Nginx ofsudo certbot --apachevoor Apache. - Beantwoord de vragen: je e-mailadres, voor welke domeinen je het certificaat wilt en of HTTP naar HTTPS moet doorverwijzen.
- Probeer de verlenging:
sudo certbot renew --dry-run
Wil je alleen het certificaat ophalen en de rest zelf instellen, voer dan sudo certbot certonly --nginx uit. Het Certbot-pakket voegt zelf een geplande taak toe (cron of een systemd-timer) en die zie je in de uitvoer van systemctl list-timers. sudo certbot certificates toont je certificaten en hun vervaldatums. Certbot verlengt een certificaat wanneer de looptijd bijna om is, en jij hoeft niets te doen. Verlenging kan toch een keer mislukken (bijvoorbeeld door een firewallregel), dus voer af en toe --dry-run uit.
Kijk om het certificaat te controleren eerst naar het hangslotpictogram in de adresbalk van de browser. Om de vervaldatum met een opdracht te zien, voer je uit:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
De regel notAfter in de uitvoer is de vervaldatum van het certificaat. Gebruik je de doorverwijzing die Certbot toevoegt niet, verwijs HTTP dan zelf door naar HTTPS. Voeg op Nginx de regel return 301 https://$host$request_uri; toe aan het serverblok dat op poort 80 luistert.
Met Caddy en zonder opdrachten
Gebruik je Caddy, dan hoef je niets extra's te installeren. Voor een domein in de configuratie haalt Caddy het certificaat op bij Let's Encrypt of ZeroSSL, verlengt het en verwijst HTTP door naar HTTPS. Volgens de officiële documentatie moeten de A- en AAAA-records van het domein naar de server wijzen, moeten de poorten 80 en 443 van buitenaf bereikbaar zijn en moet de gegevensmap van Caddy persistent en beschrijfbaar zijn. Draai je Caddy in Docker, koppel die map dan aan een volume. Anders verdwijnen de certificaten als de container wordt verwijderd, en ze opnieuw aanvragen kan tegen een rate limit aanlopen.
Wildcardcertificaten
Een wildcardcertificaat (*.example.com) dekt alle subdomeinen met één certificaat en is alleen te krijgen met DNS-01-validatie. Die validatie gebruikt poort 80 niet. Ze vraagt je een TXT-record in de DNS van je domein te zetten. Daarvoor heeft je DNS-provider een API nodig en bewaar je de API-sleutel op de server. De documentatie van Let's Encrypt noemt het bewaren van zulke sleutels op een webserver riskant. Heb je geen wildcard nodig, dan is certificaten voor losse domeinen ophalen met HTTP-01 eenvoudiger en hoef je geen DNS-sleutel te bewaren.
Veelvoorkomende fouten
| Symptoom | Waarschijnlijke oorzaak | Oplossing |
|---|---|---|
| Validatie mislukt, domein niet gevonden | Het A-record wijst naar het verkeerde IP of is nog niet doorgevoerd | Controleer het IP met dig +short example.com en wacht |
| Time-out | Poort 80 is dicht | Open 80 in ufw en in de firewall van het paneel, als je die hebt |
| De validatie slaagt soms en mislukt soms | Het AAAA-record wijst naar een andere server | Corrigeer of verwijder het AAAA-record |
| Rate limit-fout | Te veel pogingen | Gebruik --dry-run voor tests en bekijk de officiële pagina voor de limieten |
| Verlenging draait niet | Geen geplande taak, of de webserver blokkeert poort 80 | sudo certbot renew --dry-run toont de fout |
De foutmelding zegt meestal welke validatie is mislukt en welk adres Let's Encrypt op je server probeerde te bereiken. Lees de melding zoals die er staat. Het antwoord staat er vaak al in.
Volgens de officiële pagina van Let's Encrypt geldt er een limiet van 5 certificaten per week voor dezelfde set domeinnamen en 5 mislukte validaties per uur voor dezelfde domeinnaam. Gebruik dus --dry-run terwijl je experimenteert. Het probeert de verlenging in de stagingomgeving en gebruikt je echte limiet niet.
Op de kant-en-klare apps van Seturack
Kant-en-klare apps (WordPress, Nextcloud en andere) openen via HTTPS op een sslip.io-adres dat van je IP-adres is afgeleid, dus een domeinnaam is niet nodig. Koppel je je eigen domein, dan haalt Caddy het certificaat opnieuw op en installeer je niets extra's. De stappen om Caddy en de app van het domein op de hoogte te brengen staan in dit helpartikel.
Reacties0
Nog geen reacties
Deel als eerste uw gedachten.
Meld u aan of registreer u om een reactie te plaatsen.