TLS-certificaten voor security-appliances & routers
Dankzij Let’s Encrypt zijn gratis ondertekende TLS-certificaten op webservers zeer gangbaar. De gebruikelijke set-upmethode werkt echter niet voor webinterfaces van firewalls, routers en webcams. Als alternatief kun je ook overschakelen op gespecialiseerde webservices.
TLS-certificaten (Transport Layer Security) worden gebruikt om het dataverkeer tussen een webserver en de browser te versleutelen. De webserver kan zich authenticeren met een ondertekend certificaat om te bewijzen dat de gebruiker toegang krijgt tot het gewenste domein – bijvoorbeeld router.example.com. Voor TLS-codering hoeven browser- en serverproducenten alleen maar te beslissen welke methode ze gaan gebruiken en die implementeren.
Voor het authenticeren van domeinen, wat door de certificeringsautoriteiten (CA) wordt gegarandeerd, zijn extra inspanningen nodig. Voor veiligheidskritische domeinen als jouwbank.nl moeten aanvragers bewijzen dat ze eigenaar zijn van het domein. Een CA controleert daarvoor bijvoorbeeld het KVK-register.
Voor gewone domeinen is het verificatieproces geautomatiseerd. Bij Let’s-Encrypt-certificaten levert de serversoftware aan een client zoals het Python-script certbot een tekenreeks (token). De certificaataanvrager moet de token zodanig op de eigen webserver opslaan dat deze middels een specifiek url-patroon via internet kan worden opgehaald (HTTP-verificatie).
Als dat lukt, gaat Let’s Encrypt ervan uit dat de gebruiker administratieve toegang heeft tot het betreffende domein en de webserver en verstrekt dan het certificaat. Voor de zekerheid is het slechts 90 dagen geldig. Daarna moet je opnieuw aantonen dat jij de rechtmatige eigenaar bent. Tools zoals certbot doen dat automatisch en zetten de certificaten ook op de juiste plek (bij Apache, Nginx en dergelijke).
Op appliances, webcams en andere apparaten die je via een webinterface configureert, kun je geen bestanden in het pad van de webserver plaatsen. Daarom moet je die via DNS (Domain Name System) verifieren. Ook daar stuurt Let’s Encrypt een token voor. De domeineigenaar moet die token bij de verantwoordelijke DNS-server voor het betreffende domein opslaan in een apart record (TXT-record). Dat kan Let’s Encrypt dan uitlezen door middel van een DNS-request.
Ook die DNS-verificatie kan worden geautomatiseerd (zie de link op de volgende pagina). In principe komen de certificaten dan in een configureerbaar pad te staan, van waaruit je ze handmatig op de router of firewall kunt zetten.
Je kunt je dat werk besparen als je de reverse-proxy traefik voor je netwerk instelt. Traefik gebruikt wildcard-certificaten voor alle hosts van een domein, dus je hoeft het maar één keer in te stellen voor de firewall, webcam en alle andere apparaten [1]. Sommige systeembeheerders zo’n ‘single point of failure’ in hun netwerk echter niet prettig. En als er bijvoorbeeld meerdere filialen zijn, met elk hun eigen firewalls, dan moet je in elk filiaal Traefik opzetten.
CERTIFICAAT AANMAKEN
Als alternatief kun je gebruikmaken van webservices zoals freessl.org, die ook gratis Let’s-Encrypt-certificaten verstrekken. Daar geef je de hostnaam op (bijv. firewall.
example.com) en klik je op ‘Create a free SSL certificate’. Als het certificaat voor meerdere hosts moet gelden, voer de hostnamen dan in gescheiden door komma’s en zonder spaties. De hosts komen in het veld ‘Subject Alternative Name’ (SAN) in het certificaat te staan.
Als je een geldig e-mailadres invoert, zal Let’s Encrypt je er per mail aan herinneren dat het huidige certificaat moet worden verlengd. Maar je krijgt je certificaat ook als je daar een fantasie-mailadres opgeeft.
Om ervoor te zorgen dat de voor TLS benodigde privé-sleutel geheim blijft, is het aan te raden om die samen met de publieke sleutel lokaal in je eigen browser te genereren. Klik daarvoor op ‘Browser Create’ en Create. Je browser genereert dan automatisch een sleutelpaar van het type RSA met 2048 bitlengte. Het is niet eenvoudig om te controleren of de andere methoden van sleutelgeneratie betrouwbaar zijn. Voor de optie ‘Local Create’ moet bijvoorbeeld een KeyManager van een andere website geïnstalleerd worden. We raden aan de andere methoden te vermijden.
Om Let’s Encrypt je certificaat te laten ondertekenen, begint de DNS-verificatie na de sleutelgeneratie. Open daarvoor in een ander browservenster de configuratie van de verantwoordelijke DNS-server voor je domein. Kopieer het TXT-record dat FreeSSL weergeeft en sla het op de DNS-server op. De naam van het TXTrecord volgt het patroon: _acme-challenge.example.com. De token hoort thuis in het corresponderende TXT-veld. Klik op Validation.
De browser toont vervolgens de private key en de certificaatgegevens (je certificaat en het intermediatecertificaat van Let’s Encrypt). Alle componenten kunnen als zip-archief worden opgeslagen via ‘Download File’. Dat archief bevat twee bestanden: het certificaat full_chain.pem (dat wordt door de HTTPS-server aan clients geleverd) en de private.key voor de TLS-authenticatie van de server.
Met het commando openssl kun je ook andere sleuteltypes en lengtes genereren. Die hoef je dan alleen nog maar door een Certificate Signing Request (CSR) te laten ondertekenen. Een voorbeeld: openssl req -newkey rsa:4096 -sha256 -nodes -keyout mijnserver.key -out mijnserver.csr -subj ‘/CN=mijnserver.example.com’ -addext ‘subjectAltName=DNS:mijnserver.example.com’
Het bestand mijnserver.key bevat de private-key. Bewaar die ergens veilig. Een geschikte plek is bijvoorbeeld de wachtwoordmanager KeePass. Het uitvoerbestand mijnserver.csr bevat het ondertekeningsverzoek dat begint met ‘Begin Certificate Request’. Selecteer op de website van FreeSSL de optie ‘I have a CSR’ en kopieer je aanvraag naar het juiste veld. De DNS-verificatie zal dan op dezelfde manier werken als voor de sleutels die door de browser gegenereerd worden.
CERTIFICAAT IMPORTEREN
Let’s Encrypt levert de bestanden in het PEM-formaat voor webservers zoals Apache. Sommige apparaten hebben echter één enkel bestand nodig dat zowel het certificaat als de private-key bevat, zoals Fritzboxrouters en de monitoringtool ntopng. De bijpassende bestanden kun je bij elkaar kopiëren met een tekstverwerker of samenvoegen met een commando als cat full_chain.pem private.key >> fritzbox.cert. Laat tot slot de fingerprint weergeven, die je bij een van de volgende stappen nodig hebt: openssl x509 -noout - fingerprint -sha256 -inform pem -in fritzbox.cert
Bij een Fritzbox upload je het bestand fritzbox.cert in de webinterface via het menu-item ‘Internet / Permit Access / FRITZ!Box Services’. Laat het veld Password leeg, omdat de door de browser gegenereerde privésleutel niet versleuteld is. Na het klikken op Import toont de webinterface onder andere de SHA-1 fingerprint van het certificaat. Die moet overeenkomen met wat eerder door openssl getoond werd, anders heb je vermoedelijk een andere sleutel geïmporteerd dan de bedoeling was.
Voor de ntopng-server zet je het bestand in het pad /usr/share/ntopng/httpdocs/ssl/ met de naam ntopng-cert.pem (admin-wachtwoord vereist). Herstart de applicatie om de wijzigingen te accepteren: sudo service ntopng stop & sudo service ntopng start
Sommige appliances vereisen bestanden in het formaat PKCS#12. Die kun je herkennen aan de extensie .p12 of .pfx. Het certificaat en de privésleutel zitten in één bestand en zijn versleuteld met een passphrase. Dat formaat kun je ook met openssl genereren op basis van de private key en het certificaat: openssl pkcs12 -export -inkey private.key -in full_chain.pem -out mijnserver.p12
Voer een wachtwoord in voor encryptie, daar wordt later bij het importeren naar gevraagd.
Na dat alles zou je browser niet langer moeten klagen over de certificaten van je apparaten als je via HTTPS toegang tot hun webinterfaces wilt krijgen. Door het ontbreken van een automatische update moet je helaas deze procedure na uiterlijk 90 dagen herhalen.
Literatuur
[1] Merlin Schumacher en Noud van Kruysbergen, Let’s-Encrypt-wildcard-certificaten met Traefik gebruiken, c’t 7-8/2020, p.136