# Guide de configuration HTTPS avec Let's Encrypt

Ce guide vous accompagne dans la configuration d'un certificat SSL gratuit avec Let's Encrypt et la mise en place d'un reverse proxy nginx pour sécuriser votre application de gestion des formations.

---

## Prérequis

Avant de commencer, assurez-vous que les conditions suivantes sont remplies :

**Nom de domaine** : Vous devez posséder un nom de domaine (par exemple `formations.itinova.org`) pointant vers l'adresse IP de votre serveur VPS. La configuration DNS doit être active et propagée.

**Accès root** : Vous devez avoir un accès administrateur (sudo) sur votre serveur Ubuntu.

**Ports ouverts** : Les ports 80 (HTTP) et 443 (HTTPS) doivent être ouverts dans votre pare-feu pour permettre à Let's Encrypt de valider votre domaine et aux utilisateurs d'accéder à votre site.

**Application fonctionnelle** : Votre application doit être déjà installée et fonctionnelle sur le port 3000 en HTTP.

---

## Architecture de la solution

La configuration finale utilisera l'architecture suivante :

```
Internet (HTTPS:443)
    ↓
Nginx (reverse proxy)
    ↓
Application Node.js (port 3000)
    ↓
Base de données MySQL
```

Nginx agira comme un reverse proxy, gérant les certificats SSL et transférant les requêtes vers votre application Node.js. Cette architecture présente plusieurs avantages : la terminaison SSL est gérée par nginx (performances optimales), votre application n'a pas besoin de gérer les certificats, vous pouvez facilement ajouter d'autres applications sur le même serveur, et nginx peut servir les fichiers statiques directement pour améliorer les performances.

---

## Étape 1 : Installation de nginx et certbot

Nginx est un serveur web haute performance qui servira de reverse proxy. Certbot est l'outil officiel de Let's Encrypt pour obtenir et renouveler automatiquement les certificats SSL.

Commencez par mettre à jour les paquets système :

```bash
sudo apt update
sudo apt upgrade -y
```

Installez ensuite nginx et certbot avec le plugin nginx :

```bash
sudo apt install -y nginx certbot python3-certbot-nginx
```

Vérifiez que nginx est bien installé et démarré :

```bash
sudo systemctl status nginx
```

Vous devriez voir un statut "active (running)". Si nginx n'est pas démarré, lancez-le avec :

```bash
sudo systemctl start nginx
sudo systemctl enable nginx
```

---

## Étape 2 : Configuration initiale de nginx

Avant d'obtenir le certificat SSL, vous devez créer une configuration nginx de base pour votre application.

Créez un fichier de configuration pour votre site :

```bash
sudo nano /etc/nginx/sites-available/formation-manager
```

Copiez la configuration suivante en remplaçant `formations.itinova.org` par votre nom de domaine :

```nginx
server {
    listen 80;
    listen [::]:80;
    server_name formations.itinova.org;

    # Logs
    access_log /var/log/nginx/formation-manager-access.log;
    error_log /var/log/nginx/formation-manager-error.log;

    # Proxy vers l'application Node.js
    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
        
        # Timeouts
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
}
```

Activez la configuration en créant un lien symbolique :

```bash
sudo ln -s /etc/nginx/sites-available/formation-manager /etc/nginx/sites-enabled/
```

Supprimez la configuration par défaut de nginx si elle existe :

```bash
sudo rm /etc/nginx/sites-enabled/default
```

Vérifiez que la configuration nginx est valide :

```bash
sudo nginx -t
```

Si la configuration est valide, rechargez nginx :

```bash
sudo systemctl reload nginx
```

À ce stade, votre application devrait être accessible via `http://formations.itinova.org` (sans le port 3000).

---

## Étape 3 : Obtention du certificat SSL avec Let's Encrypt

Certbot va automatiquement modifier votre configuration nginx pour ajouter le support HTTPS.

Lancez certbot en mode interactif :

```bash
sudo certbot --nginx -d formations.itinova.org
```

Certbot vous posera quelques questions :

1. **Email** : Entrez votre adresse email pour les notifications importantes (expiration du certificat, problèmes de sécurité)
2. **Conditions d'utilisation** : Acceptez les conditions en tapant "Y"
3. **Partage d'email** : Vous pouvez refuser en tapant "N"
4. **Redirection HTTPS** : Choisissez l'option 2 pour rediriger automatiquement tout le trafic HTTP vers HTTPS

Certbot va alors :
- Valider que vous contrôlez le domaine
- Obtenir le certificat SSL
- Modifier automatiquement votre configuration nginx
- Configurer le renouvellement automatique

Si tout se passe bien, vous verrez un message de succès indiquant que le certificat a été obtenu et installé.

---

## Étape 4 : Vérification de la configuration HTTPS

Testez que votre site est accessible en HTTPS :

```bash
curl -I https://formations.itinova.org
```

Vous devriez voir une réponse HTTP/2 200 OK.

Ouvrez votre navigateur et accédez à `https://formations.itinova.org`. Vous devriez voir :
- Un cadenas vert dans la barre d'adresse
- Votre application fonctionnant normalement
- Aucun avertissement de sécurité

Vérifiez également que la redirection HTTP → HTTPS fonctionne en accédant à `http://formations.itinova.org`. Vous devriez être automatiquement redirigé vers HTTPS.

---

## Étape 5 : Configuration avancée de nginx (optionnel)

Pour optimiser les performances et la sécurité, vous pouvez ajouter des configurations supplémentaires.

Éditez votre fichier de configuration :

```bash
sudo nano /etc/nginx/sites-available/formation-manager
```

Ajoutez ces directives dans le bloc `server` HTTPS (celui qui écoute sur le port 443) :

```nginx
# Compression gzip
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml+rss application/json application/javascript;

# Sécurité headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;

# Cache des fichiers statiques
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
    proxy_pass http://localhost:3000;
    expires 1y;
    add_header Cache-Control "public, immutable";
}

# Limiter la taille des uploads
client_max_body_size 10M;
```

Testez et rechargez la configuration :

```bash
sudo nginx -t
sudo systemctl reload nginx
```

---

## Étape 6 : Renouvellement automatique des certificats

Les certificats Let's Encrypt sont valides 90 jours. Certbot configure automatiquement un cron job pour renouveler les certificats avant leur expiration.

Vérifiez que le renouvellement automatique est configuré :

```bash
sudo systemctl status certbot.timer
```

Vous devriez voir un timer actif. Testez le renouvellement en mode dry-run (sans vraiment renouveler) :

```bash
sudo certbot renew --dry-run
```

Si le test réussit, le renouvellement automatique fonctionnera correctement.

---

## Étape 7 : Mise à jour de la configuration de l'application

Maintenant que votre site est en HTTPS, vous devez mettre à jour la configuration des cookies pour utiliser `SameSite=None` avec `Secure`.

Éditez le fichier de configuration des cookies :

```bash
nano /var/www/formation-manager-itinova/server/_core/cookies.ts
```

Modifiez la ligne `sameSite` :

```typescript
return {
  httpOnly: true,
  path: "/",
  sameSite: "none",  // Changé de "lax" à "none"
  secure: isSecureRequest(req),  // Sera true en HTTPS
};
```

Recompilez et redémarrez l'application :

```bash
cd /var/www/formation-manager-itinova
pnpm build
sudo systemctl restart formation-manager
```

---

## Dépannage

### Le certificat n'a pas pu être obtenu

**Problème** : Certbot affiche une erreur lors de la validation du domaine.

**Solutions** :
- Vérifiez que votre domaine pointe bien vers l'IP de votre serveur : `dig formations.itinova.org`
- Vérifiez que le port 80 est ouvert : `sudo ufw status`
- Vérifiez que nginx est démarré : `sudo systemctl status nginx`
- Consultez les logs : `sudo tail -f /var/log/nginx/error.log`

### L'application ne fonctionne plus après la configuration

**Problème** : Erreur 502 Bad Gateway ou 504 Gateway Timeout.

**Solutions** :
- Vérifiez que l'application Node.js est démarrée : `sudo systemctl status formation-manager`
- Vérifiez que l'application écoute sur le port 3000 : `sudo netstat -tlnp | grep 3000`
- Consultez les logs de l'application : `sudo journalctl -u formation-manager -n 50`
- Consultez les logs nginx : `sudo tail -f /var/log/nginx/error.log`

### Les cookies ne fonctionnent plus

**Problème** : Vous êtes déconnecté immédiatement après la connexion.

**Solutions** :
- Vérifiez que `sameSite` est bien configuré sur "none" avec `secure: true`
- Videz le cache de votre navigateur
- Vérifiez dans les outils de développement (F12 → Application → Cookies) que le cookie a bien l'attribut `Secure`

### Le renouvellement automatique échoue

**Problème** : Vous recevez un email de Let's Encrypt indiquant que le certificat va expirer.

**Solutions** :
- Testez le renouvellement manuellement : `sudo certbot renew`
- Vérifiez les logs : `sudo journalctl -u certbot.timer`
- Vérifiez que nginx est configuré correctement : `sudo nginx -t`

---

## Maintenance

### Renouveler manuellement le certificat

Si vous devez renouveler le certificat manuellement (par exemple après une longue période d'inactivité) :

```bash
sudo certbot renew
sudo systemctl reload nginx
```

### Ajouter un nouveau domaine

Si vous voulez ajouter un sous-domaine ou un autre domaine :

```bash
sudo certbot --nginx -d nouveau-domaine.com
```

### Révoquer un certificat

Si vous devez révoquer un certificat (par exemple en cas de compromission de la clé privée) :

```bash
sudo certbot revoke --cert-path /etc/letsencrypt/live/formations.itinova.org/cert.pem
```

---

## Vérification de la sécurité SSL

Après la configuration, vous pouvez tester la qualité de votre configuration SSL avec l'outil SSL Labs :

1. Allez sur https://www.ssllabs.com/ssltest/
2. Entrez votre domaine : `formations.itinova.org`
3. Cliquez sur "Submit"

Vous devriez obtenir une note A ou A+. Si ce n'est pas le cas, consultez les recommandations de SSL Labs pour améliorer votre configuration.

---

## Résumé des commandes importantes

| Action | Commande |
|--------|----------|
| Vérifier le statut de nginx | `sudo systemctl status nginx` |
| Recharger la configuration nginx | `sudo systemctl reload nginx` |
| Redémarrer nginx | `sudo systemctl restart nginx` |
| Tester la configuration nginx | `sudo nginx -t` |
| Voir les logs nginx | `sudo tail -f /var/log/nginx/error.log` |
| Renouveler les certificats | `sudo certbot renew` |
| Tester le renouvellement | `sudo certbot renew --dry-run` |
| Lister les certificats | `sudo certbot certificates` |
| Voir les logs de l'application | `sudo journalctl -u formation-manager -n 50` |

---

## Conclusion

Votre application est maintenant sécurisée avec HTTPS. Les utilisateurs verront un cadenas vert dans leur navigateur, ce qui renforce la confiance et améliore le référencement. Les certificats se renouvelleront automatiquement tous les 90 jours sans intervention de votre part.

Pour aller plus loin, vous pouvez configurer un pare-feu (ufw), mettre en place une surveillance avec des outils comme Uptime Robot, ou configurer des sauvegardes automatiques de votre base de données.

---

**Auteur** : Manus AI  
**Date** : 23 novembre 2025  
**Version** : 1.0
