Guide de Configuration de Certificat SSL : Sécuriser Votre Homelab

Aperçu

Cette référence fournit des modèles rapides pour l'implémentation de certificats SSL/TLS dans les environnements homelab, couvrant à la fois les autorités de certification publiques et privées.

Comparaison des Types de Certificats

Type Confiance Renouvellement Coût Cas d'utilisation
Let’s Encrypt Publique 90 jours (automatique) Gratuit Domaines publics
Self-Signed Aucune Manuel Gratuit Test uniquement
mkcert AC Locale Manuel Gratuit Services internes
Cloudflare Origin Cloudflare 15 ans Gratuit Sites derrière proxy Cloudflare

Méthode 1 : Let’s Encrypt (Défi DNS)

Quand l'utiliser

  • Domaine public avec DNS Cloudflare
  • Services derrière un pare-feu (pas de port 80 exposé)
  • Renouvellement automatique requis

Configuration

# Install certbot
sudo apt install certbot python3-certbot-dns-cloudflare

# Create Cloudflare credentials
nano ~/.secrets/cloudflare.ini
dns_cloudflare_api_token = YOUR_CLOUDFLARE_API_TOKEN
# Obtain certificate
sudo certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials ~/.secrets/cloudflare.ini \
  -d proxmox.yourdomain.com \
  -d '*.yourdomain.com'

# Certificates saved to:
# /etc/letsencrypt/live/yourdomain.com/fullchain.pem
# /etc/letsencrypt/live/yourdomain.com/privkey.pem

Méthode 2 : mkcert (AC Locale)

Quand l'utiliser

  • Services internes (LAN uniquement)
  • Environnement de développement
  • Plusieurs appareils doivent faire confiance

Installation

# Install mkcert
sudo apt install libnss3-tools
wget https://github.com/FiloSottile/mkcert/releases/download/v1.4.4/mkcert-v1.4.4-linux-amd64
sudo mv mkcert-v1.4.4-linux-amd64 /usr/local/bin/mkcert
sudo chmod +x /usr/local/bin/mkcert

# Install local CA
mkcert -install

# Generate certificate
mkcert proxmox.lab "*.lab.local" localhost 127.0.0.1 ::1

# Output:
# proxmox.lab+4.pem (certificate)
# proxmox.lab+4-key.pem (private key)

Installation Côté Client

# Exporter le certificat de l'AC
cp "$(mkcert -CAROOT)/rootCA.pem" ~/ca-cert.pem

# Installer sur d'autres appareils :
# - Windows : Importer dans les autorités de certification racines de confiance
# - Linux : Copier vers /usr/local/share/ca-certificates/
# - Android : Paramètres → Sécurité → Installer depuis le stockage

Méthode 3 : Intégration avec Nginx Proxy Manager

Let’s Encrypt via NPM

Dans l'interface utilisateur de NPM :

Hôte Proxy → Onglet SSL
- Demander un nouveau certificat SSL
- Utiliser le Défi DNS
- Fournisseur DNS : Cloudflare
- Jeton API : [votre jeton]
- Forcer SSL : ACTIVÉ
- HTTP/2 : ACTIVÉ
- HSTS : ACTIVÉ

Certificat Personnalisé via NPM

Importer le certificat mkcert :

Certificats SSL → Ajouter un certificat SSL → Personnalisé
- Clé de Certificat : Téléverser privkey.pem
- Certificat : Téléverser fullchain.pem

Méthode 4 : ACME Proxmox

Configuration dans Proxmox

Datacenter → ACME
1. Ajouter un compte : Let's Encrypt (Production)
2. Ajouter un plugin de défi :
   - ID du Plugin : cloudflare
   - API DNS : Cloudflare Managed DNS
   - Jeton CF : [votre jeton API]

Nœud → Système → Certificats
1. Ajouter : Utilisation d'ACME
2. Domaine : proxmox.yourdomain.com
3. Type de Défi : DNS
4. Plugin : cloudflare
5. Commander le Certificat Maintenant

Automatisation du Renouvellement de Certificat

Renouvellement Automatique Let’s Encrypt

# Test renewal
sudo certbot renew --dry-run

# Auto-renewal is configured via systemd timer
sudo systemctl status certbot.timer

Script de Renouvellement Personnalisé

#!/bin/bash
# renew-certs.sh

# Renew Let's Encrypt
certbot renew --quiet

# Reload services
systemctl reload nginx
systemctl reload pveproxy

# Send notification
echo "Certificates renewed successfully" | \
  mail -s "Certificate Renewal" admin@example.com

Tâche Cron

# Add to crontab
crontab -e

# Run weekly
0 3 * * 0 /root/renew-certs.sh

Dépannage

Certificat Non Reconnu

Problème : Le navigateur affiche l'avertissement « Non sécurisé »

Solutions :

# Verify certificate chain
openssl s_client -connect domain.com:443 -showcerts

# Check CA installation (mkcert)
mkcert -CAROOT

# Reinstall CA
mkcert -uninstall
mkcert -install

Le Défi DNS Échoue

Problème : Let’s Encrypt ne peut pas valider le domaine

Solutions :

# Verify DNS propagation
dig _acme-challenge.yourdomain.com TXT

# Check API token permissions
# Must have: Zone.DNS.Edit

# Test with verbose output
certbot certonly --dns-cloudflare --dry-run -v

Certificat Expiré

Problème : Le service utilise un certificat expiré

Solutions :

# Check expiry date
openssl x509 -in /path/to/cert.pem -noout -dates

# Force renewal
certbot renew --force-renewal

# Reload service
systemctl reload nginx

Meilleures Pratiques de Sécurité

1. Configuration Robuste

# Nginx SSL configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000" always;

2. Surveillance des Certificats

# Monitor expiry
openssl x509 -in cert.pem -noout -enddate

# Alert before expiry (30 days)
EXPIRY=$(openssl x509 -enddate -noout -in cert.pem | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "$EXPIRY" +%s)
NOW_EPOCH=$(date +%s)
DAYS_LEFT=$(( ($EXPIRY_EPOCH - $NOW_EPOCH) / 86400 ))

if [ $DAYS_LEFT -lt 30 ]; then
    echo "Certificate expires in $DAYS_LEFT days!" | \
      mail -s "CERT EXPIRY WARNING" admin@example.com
fi

3. Audits Réguliers

# Check all certificates
for cert in /etc/letsencrypt/live/*/cert.pem; do
    echo "Certificate: $cert"
    openssl x509 -in "$cert" -noout -subject -dates
    echo "---"
done

Guide de Décision Rapide

Besoin d'un accès public ? → Utilisez Let’s Encrypt avec le défi DNS

Uniquement accès interne ? → Utilisez mkcert pour une AC locale

Test/développement ? → Auto-signé acceptable (mais mkcert est préféré)

Utilisez-vous Cloudflare ? → Certificat Cloudflare Origin ou Let’s Encrypt

Plusieurs services ? → Certificat Wildcard (*.yourdomain.com)

Conclusion

Une configuration SSL/TLS appropriée est essentielle pour la sécurité du homelab. Choisissez la méthode de certificat en fonction de vos besoins d'accès et des capacités de votre infrastructure. Automatisez le renouvellement pour éviter les pannes liées à l'expiration.

Points Clés : - Utilisez toujours HTTPS pour les interfaces web - Automatisez le renouvellement des certificats - Surveillez l'expiration des certificats - Utilisez des configurations TLS robustes - Documentez votre infrastructure de certificats

Pour les détails d'implémentation, consultez les articles connexes sur Nginx Proxy Manager et Cloudflare Tunnel.