Table des matières

OpenSSL

Ajouter un certificat au système

sudo apt install libnss3-tools
 
sudo cp homelab.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
sudo chmod a+r /usr/local/share/ca-certificates/

Pour que le certificat soit aussi reconnu dans Firefox et Thunderbird, il faut exécuter le script suivant (source) :

sudo apt install libnss3-tools  # pour certutil
 
readonly certificateFile="/usr/local/share/ca-certificates/homelab.crt"
readonly certificateName="Homelab"
 
find ~/.mozilla* ~/.thunderbird -name "cert9.db" | while read -r certDB
do
  certDir=$(dirname "${certDB}");
  echo "install '${certificateName}' in ${certDir}"
  certutil -A -n "${certificateName}" -t "TCu,Cuw,Tuw" -i ${certificateFile} -d ${certDir}
done

Générer un certificat auto-signé

Générer une clé privée RSA

openssl genrsa -out server.key 1024

Créer une CSR

CSR: Certificate Signing Request

openssl req -new -key server.key -out server.csr

Générer le certificat auto-signé

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
# ou
openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes # génère un .pem

Générer un certificat signé par une autorité de certification

Source

openssl x509 -req -in myserver.csr -out myserver.crt -CA superfish.pem -CAkey superfish.key -CAcreateserial -CAserial mysuperfish.srl

Lancer un serveur HTTPS

sudo openssl s_server -accept 443 -cert server.pem

Se connecter à un serveur HTTPS

openssl s_client -connect 192.168.12.1:443

Permet d'obtenir le certificat du serveur (entre les balises CERTIFICATE) et d'interagir ensuite avec le serveur (appuyer deux fois sur ENTREE !)

Connaître les dates d'un certificat

Source

openssl x509 -noout -dates -in cert.pem

Gérer sa propre PKI

Avec Smallstep

sudo curl -fsSL https://packages.smallstep.com/keys/apt/repo-signing-key.gpg -o /etc/apt/trusted.gpg.d/smallstep.asc && \
    echo 'deb [signed-by=/etc/apt/trusted.gpg.d/smallstep.asc] https://packages.smallstep.com/stable/debian debs main' \
    | sudo tee /etc/apt/sources.list.d/smallstep.list
sudo apt update
sudo apt install step-ca step-cli
 
step ca init
 
sudo step-ca $(step path)/config/ca.json
 
step ca provisioner add acme --type ACME --x509-default-dur=$((30*24))h
 
sudo useradd --user-group --system --home /etc/step-ca --shell /bin/false step
sudo setcap CAP_NET_BIND_SERVICE=+eip $(which step-ca)
sudo mv $(step path) /etc/step-ca
# put password in /etc/step-ca/password.txt
sudo chmod 400 /etc/step-ca/password.txt
# edit and adapt paths in /etc/step-ca/config/defaults.json
# edit and adapt paths in /etc/step-ca/config/ca.json
sudo chown -R step:step /etc/step-ca
# create the service in /etc/systemd/system/step-ca.service
sudo systemctl daemon-reload
sudo systemctl status step-ca
sudo systemctl enable --now step-ca
sudo journalctl --follow --unit=step-ca

Utiliser Certbot pour récupérer un certificat

Ici, on utilise Certbot pour automatiser la récupération d'un certificat pour l'interface web de PiHole :

sudo apt install certbot
 
sudo certbot certonly -n --standalone -d pihole.homelab --server https://ca.homelab/acme/acme/directory
 
sudo cat /etc/letsencrypt/live/pihole.homelab/privkey.pem /etc/letsencrypt/live/pihole.homelab/fullchain.pem | sudo tee /etc/pihole/tls.pem
sudo service pihole-FTL restart

Après la commande, Certbot va automatiquement créer un timer Systemd pour deux fois par jour renouveler les certificats. Pour que le certificat renouvelé soit pris en compte par PiHole, créer le script /etc/letsencrypt/renewal-hooks/deploy/pihole (lui donner l'autorisation en exécution) :

#!/bin/sh -eu
 
found=0
for domain in $RENEWED_DOMAINS
do
    if [ "$domain" = "pihole.homelab" ]
    then
        found=1
    fi
done
if [ "$found" = "0" ]
then
    exit 0
fi
 
cp /etc/pihole/tls.pem /etc/pihole/tls.pem.old
cat /etc/letsencrypt/live/pihole.homelab/privkey.pem /etc/letsencrypt/live/pihole.homelab/fullchain.pem > /etc/pihole/tls.pem
 
service pihole-FTL restart

Un bug dans la version 4.0.0 de Certbot considère que renew_before_expiry vaut toujours 30 jours. Si les certificats ont une durée de validité de 30 jours, cela signifie qu'ils sont renouvelés à chaque fois. Pour contourner le bug, il faut préciser la durée de renouvellement dans /etc/letsencrypt/renewal/domain.conf :

renew_before_expiry = 10 days