Let’s Encrypt – Nginx

Skrevet af: Patrick Kerwood

Vi kender alle bøvlet med at lave SSL certifikater til vores websites. Domæne validering, opsætning, udløb osv. Let’s Encrypt gør det nemt, enkelt og gratis.

I denne post vil jeg vise hvordan du sætter SSL med Let’s Encrypt op, sammen med Nginx.

I stedet for at installere klienten, bruger jeg deres Docker container. Hvis du ikke ved hvad Docker er, har du sovet i timen. Docker er det nye sort. Du kan finde en installations guides i deres super dokumentation. https://docs.docker.com/engine/installation/linux/debian/

Under hele guiden, skift test.linuxbloggen.dk ud med dit eget domæne.

Opsætning

Start med at pull docker containeren.
docker pull quay.io/letsencrypt/letsencrypt:latest

Nedenstående er en standard Nginx host konfiguration. Vi skal have den beef’et den lidt op, så Let’s Encypt kan autentificere domænet og enable SSL. Tilføj linje 16-19 til konfigurationen. Let’s Encrypt bruger /.well-known/acme-challenge til at validere domænet.

Reload Nginx.
sudo systemctl reload nginx

Kør følgende kommando for at validere dit domæne og download dit certifikat.
docker run -it --rm --name letsencrypt \
    -v "/etc/letsencrypt:/etc/letsencrypt" \
    -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
    -v /tmp/letsencrypt-auto:/tmp/letsencrypt-auto \
    quay.io/letsencrypt/letsencrypt:latest \
    auth -a webroot --webroot-path /tmp/letsencrypt-auto
    -d test.linuxbloggen.dk

Hvis alt er gået som det skal, er domænet valideret og certifikatet downloaded. Certifikatet og private key’en ligger i /etc/letsencrypt/live/test.linuxbloggen.dk

Så skal vi i gang med at modificere host konfigurations filen. Start med ændre location / så den altid redirecter til SSL.

 
Og fjern unødvendige linjer som:

 
Efterfølgende tilføj sektion til konfigurationen. Læg mærke til at location '/.well-known/acme-challenge' også er i denne sektion, da certifikatet skal fornyes og alt traffik til port 80 bliver redirected til 443.

 
Hele configurations filen ser nu således ud.

Reload Nginx.
sudo systemctl reload nginx

Dit site skulle nu redirect til SSL og bruge det nye certifikat.

Fornyelse

Lets’s Encrypt certifikater er kun gyldige i 90 dage. Men eftersom alt kører automatisk er det jo ikke noget problem. Nedenstående er kommandoen til at forny certifikatet.
docker run -i --rm --name letsencrypt \
    -v "/etc/letsencrypt:/etc/letsencrypt" \
    -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
    -v /tmp/letsencrypt-auto:/tmp/letsencrypt-auto \
    quay.io/letsencrypt/letsencrypt:latest \
    auth -a webroot --webroot-path /tmp/letsencrypt-auto
    -d test.linuxbloggen.dk --renew-by-default \
    && systemctl reload nginx.service

Smid kommandoen i root’s crontab (uden line breaks).
sudo crontab -e

Nedenstående fornyer certifikatet hver 60 dage og reloader Nginx servicen.
0 0 */60 * * docker run -i --rm --name letsencrypt -v "/etc/letsencrypt:/etc/letsencrypt" -v "/var/lib/letsencrypt:/var/lib/letsencrypt" -v /tmp/letsencrypt-auto:/tmp/letsencrypt-auto quay.io/letsencrypt/letsencrypt:latest auth -a webroot --webroot-path /tmp/letsencrypt-auto -d test.linuxbloggen.dk --renew-by-default && systemctl reload nginx.service

Hardening

Som konfigurationen ser ud nu, får du et halv godt, gult “B”, inde på https://www.ssllabs.com/ssltest/, som du kan se i billedet nedenunder.

Det kan gøres bedre med nogle extra linjer.

Begræns udvalget af protocol’er.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

Définer cipher suite.
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';

Beskyt din server mod Beast Attack.
ssl_prefer_server_ciphers on;

Generer en EDH key.
cd /etc/ssl/certs && sudo openssl dhparam -out dhparam.pem 2048

Tilføj EDH key’en den til konfigurationen.
ssl_dhparam /etc/ssl/certs/dhparam.pem;

Til sidst tilføj HTHS til både port 80 og port 443 sektionerne.
add_header Strict-Transport-Security max-age=15768000;

Konfigurationen ser nu således ud.

 
Reload Nginx og kører din test igen. Resultatet er A+.


6 apr 2016   | Alle · Docker

Leave a Reply