✦ Oplossingen · SSL- en certificaatfouten

SSL-certificaat verlopen: Let’s Encrypt vernieuwen (certbot renew)

Is het SSL-certificaat van je website verlopen of mislukt certbot renew? Controleer de timer, poort 80, DNS en CAA, vernieuw het certificaat en herlaad de webserver.

Zo ziet de foutmelding eruit

  • NET::ERR_CERT_DATE_INVALID
  • SEC_ERROR_EXPIRED_CERTIFICATE
  • Failed to renew certificate
  • Some challenges have failed.

Waarom gebeurt dit?

Certificaten van Let’s Encrypt zijn 90 dagen geldig. Dat is bewust kort: de verlenging hoort volledig automatisch te gaan. certbot (het meestgebruikte programma daarvoor) probeert een certificaat te vernieuwen zodra het minder dan 30 dagen geldig is, via een systemd-timer of cronjob. Gaat dat een tijd stil mis, dan verloopt het certificaat en zien bezoekers NET::ERR_CERT_DATE_INVALID.

Bij elke verlenging controleert Let’s Encrypt dat jij het domein beheert. Meestal via de HTTP-01-controle: Let’s Encrypt vraagt een bestand op onder http://domein.nl/.well-known/acme-challenge/. Dat moet via poort 80 bereikbaar zijn, op de server waar certbot draait. Een firewall die poort 80 dichtzet, een doorverwijzing die dat pad onbereikbaar maakt, DNS die naar een andere server wijst of een CAA-record dat Let’s Encrypt niet toestaat, laat die controle mislukken.

En soms slaagt de verlenging wel, maar is de webserver niet herladen. Dan staat het nieuwe certificaat op schijf en serveert de webserver nog steeds het oude. Let’s Encrypt heeft bovendien aangekondigd de looptijd van certificaten verder in te korten. Goed werkende automatische verlenging en bewaking worden dus steeds belangrijker.

Zo herken je dit probleem

  • Je bezoekers zien NET::ERR_CERT_DATE_INVALID en openssl … -dates toont een notAfter in het verleden.
  • certbot renew of het log meldt Some challenges have failed, een timeout of een 404 op /.well-known/acme-challenge/.
  • certbot certificates toont een nieuwe vervaldatum, maar de browser toont de oude: de webserver is niet herladen.
  • Is het certificaat geldig maar voor een andere naam, dan is het geen verloopprobleem: zie ERR_CERT_COMMON_NAME_INVALID.

Zo los je het op, stap voor stap

Menunamen kunnen per versie of toestel iets anders heten. Loop de stappen op volgorde af en stop zodra het werkt.

  1. Bekijk welke certificaten er zijn en wanneer ze verlopen

    Vergelijk wat certbot denkt met wat de server echt aanbiedt. Wijkt de datum van openssl af van die van certbot certificates, dan gebruikt de webserver een ander bestand of is hij niet herladen.

    sudo certbot certificates
    openssl s_client -connect domein.nl:443 -servername domein.nl </dev/null 2>/dev/null | openssl x509 -noout -dates
  2. Test de verlenging met een droge run

    Een droge run doet de hele controle tegen de testomgeving van Let’s Encrypt, zonder iets te vervangen. De foutmelding vertelt welke stap faalt. Meer detail staat in het log.

    sudo certbot renew --dry-run
    sudo tail -n 50 /var/log/letsencrypt/letsencrypt.log
  3. Controleer of de automatische verlenging draait

    Bij een installatie via de pakketbeheerder heet de timer meestal certbot.timer, bij een snap-installatie snap.certbot.renew.timer. Staat er geen timer, kijk dan in /etc/cron.d/ naar een cronjob voor certbot.

    systemctl list-timers | grep certbot
    sudo journalctl -u certbot.service --since "7 days ago"
    ls /etc/cron.d/ | grep -i certbot
  4. Zorg dat poort 80 en de controle-map bereikbaar zijn

    Let’s Encrypt moet het controlebestand via http op poort 80 kunnen ophalen. Zet poort 80 open in de firewall, ook als je site alleen https gebruikt. Een doorverwijzing van http naar https is prima, zolang het pad /.well-known/acme-challenge/ daarna nog werkt. Test met een eigen bestand in de webroot.

    sudo ufw status
    sudo ufw allow 80/tcp
    
    sudo mkdir -p /var/www/html/.well-known/acme-challenge
    echo test | sudo tee /var/www/html/.well-known/acme-challenge/test
    curl -i http://domein.nl/.well-known/acme-challenge/test
  5. Controleer DNS en het CAA-record

    Het domein (en www) moet naar deze server wijzen, ook via IPv6 als er een AAAA-record staat. Een CAA-record bepaalt welke uitgevers certificaten voor je domein mogen maken; staat er een CAA-record zonder Let’s Encrypt, dan weigert die. Met de domeincheck zie je de records ook.

    dig +short domein.nl A
    dig +short domein.nl AAAA
    dig +short www.domein.nl A
    dig +short domein.nl CAA
    # toegestaan voor Let's Encrypt:
    # 0 issue "letsencrypt.org"
  6. Vernieuw en herlaad de webserver

    Werkt de droge run, vernieuw dan echt. Laat certbot daarna voortaan zelf de webserver herladen met een deploy-hook: die draait alleen als er werkelijk een nieuw certificaat is. Controleer daarna opnieuw met openssl.

    sudo certbot renew
    sudo nginx -t && sudo systemctl reload nginx
    # Apache: sudo apachectl configtest && sudo systemctl reload apache2
    
    # voortaan automatisch herladen:
    sudo certbot renew --deploy-hook "systemctl reload nginx"
  7. Is het certificaat al verlopen: vraag het opnieuw aan

    Lukt verlengen niet, vraag dan een nieuw certificaat aan met alle namen. Met de nginx- of Apache-plugin regelt certbot ook de configuratie. Draai je zelf een andere webserver, gebruik dan de webroot-methode.

    sudo certbot --nginx -d domein.nl -d www.domein.nl
    # of met webroot:
    sudo certbot certonly --webroot -w /var/www/html -d domein.nl -d www.domein.nl
  8. Controleer daarna de site zelf

    Na een nieuw certificaat kan de site nog onderdelen via http laden, waardoor het slotje ontbreekt. Zie mixed content na SSL. Gebruikt je site HSTS, dan konden bezoekers in de tussentijd niet doorklikken; zie HSTS-fout. Een website-scan laat zien of alles weer klopt.

Let op: Vraag niet steeds opnieuw een certificaat aan als het mislukt: Let’s Encrypt heeft limieten op het aantal (mislukte) aanvragen. Test eerst met --dry-run en los de oorzaak op.

Voorkomen: verlenging bewaken

Automatische verlenging is pas betrouwbaar als iemand merkt wanneer hij faalt. Reken er niet op dat je vanzelf een herinnering krijgt.

  • Controleer regelmatig met de openssl-opdracht hierboven hoeveel dagen het certificaat nog geldig is, of laat een monitoringdienst dat doen.
  • Draai na elke wijziging aan firewall, doorverwijzingen of DNS een certbot renew --dry-run.
  • Zet een deploy-hook zodat de webserver na elke verlenging herladen wordt.
  • Verhuis je de site, regel dan ook het certificaat op de nieuwe server; zie website verhuizen.

Loopt de site via een CDN of proxy, dan heeft die meestal een eigen certificaat voor bezoekers. Het certificaat op je eigen server moet dan nog steeds geldig zijn als het CDN in een strikte modus naar je server verbindt.

Wanneer schakel je hulp in?

  • De droge run blijft falen en je ziet in het log niet welke stap het probleem is.
  • De site draait achter een CDN, proxy of loadbalancer en je weet niet welk certificaat waar verloopt.
  • Je wilt een wildcardcertificaat met DNS-controle en weet niet hoe je dat automatisch laat verlengen.
  • Er draaien veel sites op één server en meerdere certificaten verlopen tegelijk.

Lukt het niet? Wij helpen

Kom je er met deze stappen niet uit, of wil je het liever niet zelf doen? We kijken online mee of komen langs. Hulp op afstand kost €20 per uur; komen we langs, dan is de prijs op aanvraag. Je weet vooraf waar je aan toe bent.

Aanvraag

Hulp aanvragen

Schrijf kort wat er misgaat en wat je al hebt geprobeerd. Kies of we bellen, online meekijken of langskomen.

Veelgestelde vragen

Vragen over dit probleem

Hoe lang is een Let’s Encrypt-certificaat geldig?

90 dagen. certbot probeert te verlengen zodra er minder dan 30 dagen over zijn, zodat er ruim tijd is om een mislukte verlenging op te merken.

Waarom moet poort 80 open als mijn site alleen https gebruikt?

De standaardcontrole van Let’s Encrypt (HTTP-01) haalt een bestand op via http op poort 80. Een doorverwijzing naar https mag, maar de poort moet bereikbaar zijn.

De verlenging is gelukt, maar bezoekers zien nog het oude certificaat.

Herlaad de webserver. Zet een deploy-hook zodat certbot dat voortaan zelf doet.

Wat doet een CAA-record?

Het geeft aan welke certificaatuitgevers voor je domein certificaten mogen maken. Staat Let’s Encrypt er niet bij, dan weigert die een certificaat uit te geven.