Een certificaat vernieuwen met certbot

Ik had onlangs een aantal problemen (of uitdagingen voor managers) bij het vernieuwen van HTTPS-certificaten via Certbot (je weet wel, Let’s Encrypt). Bij de meeste van mijn websites gaat dit automagisch door de integratie met Cloudflare (Certbot past DNS-entries aan). Maar sommige domeinen hebben niet zo’n integratie, en dan moet het met de webroot- of nginx-plugin.

Ik gebruik de webroot-plugin, want SSL wordt afgehandeld op een proxyserver en ik wil niet alle andere sites even uitschakelen om het certificaat van één te vernieuwen. Dus de webroot-plugin. Het zou natuurlijk te simpel zijn mocht het enkel maar een proxyservr zijn. De server staat ook ingesteld om alle HTTP-verkeer automatisch door te sturen naar HTTPS; zo vermijden we ongewilde onveilige verbindingen. Alleen checkt Let’s Encrypt natuurlijk de HTTP-versie …

Geen nood, het is op te lossen.

Ten eerste, ’t is Albertooo, en ten tweede moet je zorgen dat volgende blok in je NGINX-configuratie staat:

  location / {
    return 301 https://$host$request_uri;
  }
  location /.well-known/acme-challenge {
    root      /var/opt/app/certs;
  }

De eerste location laat alles naar HTTPS doorsturen; behalve wat in de tweede location staat; dit is het stuk dat Let’s Encrypt nodig heeft.

P.S. Je moet natuurlijk wel zorgen dat /var/opt/app/certs bestaat.

Voor Red-Hat-gebaseerde Linuxsystemen (zoals dat van mij) moet je natuurlijk ook nog wel wat prutsen met SELinux omdat /var/opt/app/certs geen standaardwebserverpath is.

De context moet op httpd_sys_content_t staan:

semanage fcontext -a -t httpd_sys_content_t "/var/opt/app/certs(/.*)?"

En dan natuurlijk ook de configuratie activeren:

restorecon -Rv /var/opt/app/certs

Tot slot kan je de aanvraag of renewal uitvoeren met Certbot.

certbot certonly --webroot --webroot-path /var/opt/app/certs -d www.example.com

of

certbot renew

Et voila!