Sådan sikres din nginx med Let's Encrypt
Introduktion
Let's Encrypt er en ny certificerings-udbyder (CA) der både gør det nemt at genere og installere et TLS/SSL-certifikat. Men vigtigst af alt - Let's Encrypt gør det også gratis.
Let's Encrypt er et nyt projekt der er skabt af en række store virksomheder som bl.a. Google, Facebook, Mozilla, Cisco, HP mv. med det formål at gøre Internettet mere sikkert. Med et SSL-certifikat kan du i stedet for den klassiske http:// tilbyde din brugere en krypteret og mere sikker https://.
Let's Encrypt består af en simpel software-klient som automatisere den tidligere lidt mere langhårede process. Det betyder at det nu både er nemmere og gratis at få krypteret trafikken mellem din server og dine besøgende.
Let's Encrypt har en fuld automatiseret process som pt. kun virker på Apache-webserveren, da vi kører Nginx er der derfor stadig et par enkelte ting, vi manuelt skal gøre - og som jeg vil gennemgå trin-for-trin i denne video.
I denne trin-for-trin videoguide vil vi vise dig, hvordan du bruger Let's Encrypt til at få et gratis SSL-certifikat og hvordan du kan bruge dette sammen med nginx på vores Ubuntu Cloud-server. Vi vil også vise dig, hvordan du automatisk kan forny dit SSL-certifikat vha. et cronjob.
Hvis du benytter en anden webserver end nginx, skal du blot følge web-serverens dokumentation for at bruge certifikatet, som du generer i denne video, det kunne f.eks. være din NAS-boks, din Plex Streaming-server eller måske din webmail-klient.
Så kort fortalt: I denne video kigger vi på den gratis SSL-udbyder Lets Encrypt og hvordan du kan opsætte dit nye gratis https/SSL-certifikat på nginx.
Forberedelse til denne video
Før du går i gang med denne videoguide, er der et par ting som er nødvendige at have styr på:
1. I denne video er vi logget på som root, husk at bruge sudo foran dine kommandoer, hvis du ikke er logget på med root.
2. Du skal have et domæne eller subdomæne som peger på serverens IP-adresse, således du kan tilgå serveren på ex. ditdomæne.dk eller srvXX.cloudnet.dk.
Når du køber en Cloud-server på v5.dk, får du automatisk et domæne der hedder srvXX.cloudnet.dk som kan benyttes.
Har du dit eget domæne ex. danielbahl.dk, skal dette domæne pege på serveren vha. en gyldig DNS-opsætning med en A-record der peger mod serverens IP-adresse.
Kort fortalt: Du skal kunne besøge hjemmesiden på serveren med domæne/hostname f.eks. http://et-domæne/.
Lad os komme igang.
Installation af Let's Encrypt
Step 1: Gør serveren klar
Det første punkt vi skal igennem er meget simpelt. Vi skal installere to værktøjer som skal bruges for at hente Let's Encrypt. Den bedste måde at installere Let's Encrypt på, er ved blot at clone deres officielle GitHub-repository.
Tip: Det forventes at Let's Encrypt bliver en del af apt-get pakke-systemet i nær fremtid. Men ved at clone det officielle repository fra GitHub, er du sikker på altid at have nyeste version.
Start med at opdatere din servers pakke-index med kommandoen:
sudo apt-get update
Installer Git og bc
sudo apt-get -y install git bc
Nu hvor de to pakker er installeret, kan vi nemt clone letsencrypt softwaren fra deres officielle respos. på GitHub:
Step 2: Klon fra GitHub
Vi kan nu nemt klone hele Let’s Encrypt repository ned i /opt på vores Linux-server:
sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
Klargør og generer SSL-cert.
Tilføj til vores server-block i nginx
Når vi genererer et certifikat om lidt, angiver vi vores "webroot"-mappe, altså mappen hvor vores hjemmeside ligger placeret. Det gør vi fordi letsencrypt-klienten placerer en fil i mappe med en nøgle, som bruges til at validere det angivne domæne er korrekt, således vi ikke kan lave certifikater til domæner vi ikke ejer.
For at sikre at letsencrypt-tjenesten kan tilgå denne nye fil, skal vi ind og tilføje en "allow all" i vores nginx server-block konfiguration. Vi åbner derfor default-filen i nano:
sudo nano /etc/nginx/sites-available/default
Her i, som det også bliver vist i videoen, indsætter vi følgende:
location ~ /.well-known {
allow all;
}
Og reloader vores nginx, så ændringerne kommer til live:
sudo service nginx reload
Så er vores nginx klar til at vi kan genere vores nye SSL-certifikat.
Generer SSL-certifikat
Som vist i videoen skal vi nu generere vores nye certifikat. Det gøres nemt med kommandoen her, som er yderligere forklaret i videoen inkl. hvordan man gør ved flere domæner, domæner med- og uden www foran samt subdomæner:
./letsencrypt-auto certonly -a webroot --webroot-path=/var/www/html -d ditdomain.dk
Bemærk: Er du ikke logget på som root, vil du bedt om at indtaste dit password for at programmet letsencrypt-auto kan opnå de nødvendige rettigheder (sudo).
Processen med at generere certifikatet er yderligere forklaret i videoen.
Generer en stærk DH gruppe
Nu skal vi generere en stærk Diffie-Hellman group. De fleste browsers som Google Chrome, Mozilla Firefox og Microsoft Internet Explorer / Edge har forhøjet deres krav omkring minimum gruppe-størrelse til 1024-bit, vi anbefaler at du laver en 2048-bit DH-gruppe. Det er meget nemt med følgende kommando:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Opsæt vores nye SSL-cert.
Installation i nginx
Nu skal vi have installeret vores nye certifikater i nginx. I videoen gennemgår vi mere detaljeret de enkelte filer i vores SSL-certifikat samt de forskellige kommandoer. Men kort fortalt, vi skal åbne vores default fil i nano-editoren:
sudo nano /etc/nginx/sites-available/default
Her kan vi under vores første server-block rette port 80 til 443:
Udkommenter de to "listen 80" linjer, ved at sætte havelåge (#) foran:
#listen 80 default_server;
#listen [::]:80 default_server;
Og ligeledes, fjern havelåger foran de to "listen 443" linjer:
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
Nedenunder kan du nu indsætte de to SSL-certifikater. De bliver gennemgået mere detaljeret i videoen:
ssl_certificate /etc/letsencrypt/live/ditdomain.dk/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ditdomain.dk/privkey.pem;
Herefter opsætter vi, så der kun tillades de mere sikre SSL-protokoller og ciphers, og ikke mindst vores DH-gruppe vi genererede tidligere:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
Automatisk viderestil http til https
Vi kan ydermere i bunden af vores nginx config-fil tilføje disse 4 linier, for at sikre at alle http:// automatisk bliver omdirigeret til https://
server {
listen 80;
server_name ditdomain.dk www.ditdomain.dk;
return 301 https://$host$request_uri;
}
Lad os få reloadet nginx med de nye ændringer:
sudo service nginx reload
Test dit nye certifikat:
Du kan nu teste det nye SSL-certifikat vha. Qualys SSL Labs Report værktøj på adressen:
https://www.ssllabs.com/ssltest/
Automatisk forny dine SSL-certifikater
Vi gennemgår dette emne nærmere i videoen. Her er et eksempel på et cronjob der kører hver mandag kl. 02.30 om natten, og opdaterer/fornyer dine SSL-certifikater:
Kør følgende kommando:
sudo crontab -e
Og indsæt følgende:
30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/letsencrypt-renew.log
35 2 * * 1 /etc/init.d/nginx reload
Hold din Let's Encrypt klient opdateret
Når der kommer nye opdateringer til Let's Encrypt klienten er det heldigvis super nemt at hente den nyeste version fra git. Det gøres blot ved at køre kommandoen git pull inde fra /opt/letsencrypt-mappen:
cd /opt/letsencrypt
sudo git pull
God fornøjelse med denne trin-for-trin videoguide fra v5.dk.