En aquest article vull explicar-te com m'he creat un certificat SSL i he configurat el servidor web Nginx a FreeBSD per tal de securitzar amb https la meua web.
En la meua última publicació "Migrant la web d'un hosting comercial a un hosting DIY amb la Raspberry Pi 4 i FreeBSD 13" vaig explicar que ja no estava a un hosting comercial com abans, des de feia 18 anys, sinó que ara ja tenia el meu propi servidor i que, a més a més, es tractava d'una Raspberry Pi 4 amb 8 GB de RAM corrent amb FreeBSD 13.2. Una passada d'entorn,la veritat. Doncs bé, ara necessitava urgentment configuar-me l'https a la web per tal de tenir més seguretat i, a més a més, SEO òptim ja que Google penalitza les webs sense https, per si no ho sabies. Aleshores, m'he ficat mans a l'obra.
Al meu entorn tinc FreeBSD 13.2 corrent a una Raspberry Pi 4 amb 8GB de RAM on tinc instal·lat Nginx, PHP 8.2 per a les webs amb Drupal, i ara l'objectiu és generar un certificat SSL i posteriorment que les peticions http que van pel port 80 es redirigisquen al port 443 automàticament.
Per tal d'instal·lar un certificat SSL, necessitem els següents fitxers:
- 1. Certificat (.crt)
- 2. Clau privada (.key)
- 3. Autoritat de certificació (.ca)
El certificat SSL va pel port 443, així que el primer de tot que ens caldrà serà tenir obert el port 443 apuntant al la màquina on tinguem el servidor Nginx. Si faig un escaneig de ports, veig que nomès tinc els ports 22, 80 i 5900 oberts,iperò.no tinc el 443, per tant necessitarem obrir-lo:
# nmap -F DOMINI
Starting.Nmap 7.93 ( https://nmap.org ) at 2023-09-13 07:47 UTC
Nmap scanireport. Host is.up (0.0013s latency).
Not shown: 97 filtered tcp portsi(no-response)
PORT.STATE SERVICE
22/tcp open ssh
80/tcp open http
5900/tcp closed vnc
Nmap.done: 1 IP address (1 host up) scanned in 3.08 secondsi
Si no obrim el port en el nostre tallafocs, ens donarà el següent error:
Això vol dir que no pot accedir al port 443, per tant una vegada obrim el port 443 podrem continuar amb la configuració de l'https.
QUÈ ÉS LET'S ENCRYPT
Citant la definició de la Vikipèdia, Let's Encrypt és una autoritat de certificació gratuïta, automatitzada i oberta (certificate authority CA), que opera en benefici públic. És un servei proporcionat pel Grup de Recerca de Seguretat d'Internet (ISRG).[1] Ofereixen certificats digitals per a activar HTTPS (SSL / TLS) en els llocs web, de franc i fàcils d'usar. L'objectiu de Let's Encrypt és crear una web més segura i respectuosa amb la privacitat.
Tenim moltes opcions, però amb Let's Encrypt crear un certificat SSL és gratis i molt fàcil, i els podrem generar al vol fàcilment amb certbot disponible a FreeBSD.
INSTAL·LACIÓ DEL CERTIFICAT
Així que instal·larem certbot amb:
# doas pkg install py39-certbot py39-certbot-nginx
Certbot és un programari que pots instal·lar des de FreeBSD, OpenBSD o qualsevol distribució normal de GNU/Linux, no trobaràs cap problema per a trobar-lo.
Ara ***IMPORTANT*** necessitem aturar el servidor web Nginx, perquè a l'hora de generar el certificat de Let's Encrypt, aquest crea un servidor web virtual i si tinguèrem l'Nginx en funcionament, ens donaria un error i no podria instal·lar-ho.
Aleshores aturarem el servidor web Nginx:
#service nginx stop
Stopping nginx.
Waiting for PIDS: 1096.
# service nginx status
nginx is not running.
I bé, ara ja podrem generar els certificats amb:
# certbot --nginx -d joancatala.net -d www.joancatala.net
CONFIGURACIÓ A NGINX
La configuració la fa automàticament certbot que afegirà les línies on connecta amb el certificat que acabem de generar. El fitxer de configuració del meu site a Nginx està a /usr/local/etc/nginx/sites-enabled/joancatala.conf i simplement s'ha afegit al final:
listen 443 ssl; # managed by Certbot
ssl_certificate /usr/local/etc/letsencrypt/live/joancatala.net/fullchain.pem; # managed by Certbot
ssl_certificate_key /usr/local/etc/letsencrypt/live/joancatala.net/privkey.pem; # managed by Certbot
include /usr/local/etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /usr/local/etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
#
server {
listen 80;
server_name joancatala.net www.joancatala.net;
return 301 https://$host$request_uri;
}
D'aquesta manera, quan escribim https://joancatala.net o https://www.joancatala.net, el navegador web ja detecta el certificat SSL i ja confia en que és un lloc segur.
De fet, la última part del codi, fa que quan algú escriba http://joancatala.net (que és el port 80) li envie directament a httpS://joancatala.net (que és el port 443) o des de http://www.joancatala.net li envie directament a httpS://www.joancatala.net. El que fa açò exactament és:
server {
listen 80;
server_name joancatala.net www.joancatala.net;
return 301 https://$host$request_uri;
}
RENOVACIÓ DELS CERTIFICATS
Així sabem l'estat dels nostres certificats instal·lats:
#certbot certificates
Els certificats de Let's Encrypt són nomès vàlids durant 90 dies, aleshores cal que els usuaris renovem els certificats regularment abans d'aquest temps.
Per a renovar el certificat SSL, farem:
certbot certonly --force-renew -d DOMINI_WEB
Per exemple, si vull renovar el certificat del meu blog web, faré:
certbot certonly --force-renew -d joancatala.net
Si ara anem a la ruta /usr/local/etc/letsencrypt/live/ veurem que tenim el nostre anterior certificat i el nou (on té "-0001" afegit al nom). Doncs bé, jo el que he fet és esborrar l'antic i afegir el nou, i ja m'ha funcionat la navegació amb https:
root@mercuri:/usr/local/etc/letsencrypt/live #cd /usr/local/etc/letsencrypt/live/
root@mercuri:/usr/local/etc/letsencrypt/live # ls
README joancatala.net joancatala.net-0001
root@mercuri:/usr/local/etc/letsencrypt/live #rm -rf joancatala.net
root@mercuri:/usr/local/etc/letsencrypt/live #mv joancatala.net-0001 joancatala.net
Com a curiositat: si abans volem fer una simulació per a provar si ho tenim bé, podem fer el següent, i let's encrypt farà una simulació però no escriurà res en la configuració d'Nginx ni descarregarà cap certificat:
doas certbot renew --dry-run
Si no veus errors és que el procés aniria bé, aleshores ja pots atualitzar-ho amb --force-renew quan vullgues :)
Podem configurar el Crontab per a renovar-los automàticament. El Crontab serà el de l'usuari root perquè certbot requereix de privilegis d'administrador. Ho farem amb:
0 0,12 * * * /usr/local/bin/certbot renew
Si el procés de renovació falla, Let's Encrypt ens enviarà un missatge al correu que haurem especificat durant la generació del certificat.