Système de mise à jour sécurisé composé de trois composants côté serveur Debian — une API HTTPS, un site web de téléchargement et un dépôt de paquets — ainsi que d'un client Python pour Windows.
Version du guide : v2
Le système repose sur :
- Serveur API sécurisé : HTTPS sur le port
8443 - Site web de téléchargement : HTTP sur le port
3000 - Dépôt de paquets : versions des mises à jour disponibles sur le serveur
- Client Windows : Python 3.10+ avec configuration pré-remplie
La sécurité repose notamment sur :
- TLS 1.3
- Certificat SSL
- Clés RSA 4096
- Signatures RSA avec SHA-256
- Vérification d'intégrité SHA-256
- Tokens d'authentification
- Le client Windows ouvre
http://IP:3000. - Il clique sur Télécharger et récupère
update-client.zip. - Il décompresse le ZIP ;
config.iniest déjà pré-rempli. - Il installe Python et les dépendances.
- Il lance
python client.py. - Le client contacte l'API en HTTPS sur
8443. - Le manifeste est vérifié par signature RSA.
- Le paquet est téléchargé, vérifié par SHA-256 puis installé.
- Debian Linux
- Node.js 20
- npm
- OpenSSL
zipcurl- Accès SSH au serveur
- Ports
3000et8443accessibles depuis les clients
- Windows
- Python
3.10+ - Navigateur web
- Accès réseau au serveur Debian
Mettre à jour le système :
sudo apt-get update && sudo apt-get upgrade -yInstaller Node.js 20 :
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs openssl zip curlVérifier les versions :
node --version
npm --versionLe guide indique notamment :
Node.js : v20.x.x
npm : 10.x.x
Transférer serveur-debian.zip sur le serveur Debian.
Depuis Windows PowerShell :
scp serveur-debian.zip USER@192.168.1.XXX:/home/USER/Sur Debian :
unzip serveur-debian.zip -d ~/update-system
cd ~/update-system/server
npm installDepuis le répertoire du serveur :
cd ~/update-system/server
chmod +x setup-certs.sh
bash setup-certs.shLe script détecte l'IP locale et génère un certificat valable 10 ans.
Fichiers générés :
certs/server.key # NE PAS PARTAGER
certs/server.crt # distribué automatiquement via le site
Notez l'IP affichée par le script. Elle correspond à l'adresse que les clients utiliseront pour accéder au site de téléchargement :
http://192.168.1.42:3000
Remplacez
192.168.1.42par l'adresse réellement affichée sur votre serveur.
Exécuter :
node setup-keys.jsLe script génère :
keys/private.pem # NE PAS PARTAGER
keys/public.pem # distribuée via le site
Le script génère également les tokens d'administration et de client.
Le token client est automatiquement intégré dans le config.ini du ZIP généré par le site. Le client Windows n'a donc rien à configurer manuellement.
Sécurité : ne partagez jamais
keys/private.pem, le token administrateur ou les autres secrets générés.
chmod +x create-test-packages.sh
bash create-test-packages.shLe script crée les versions de test :
1.0.0
1.0.1
1.0.2
La version 1.0.2 est proposée comme mise à jour dans le scénario du guide.
Un seul script permet de démarrer simultanément l'API et le site :
chmod +x start-all.sh
bash start-all.shLe script vérifie notamment :
- les prérequis ;
- les clés RSA ;
- le certificat SSL ;
- l'IP locale.
Une sortie typique ressemble à :
Vérification des prérequis...
Clés RSA : OK
Certificat SSL : OK
IP locale : 192.168.1.42
API mises à jour : https://192.168.1.42:8443
Site téléchargement: http://192.168.1.42:3000
Dites à vos clients de visiter http://192.168.1.42:3000
Ctrl+C pour tout arrêter
Il est également possible de démarrer les deux serveurs séparément :
node server.jset :
node download-site.jsModifier d'abord les deux fichiers service afin de remplacer votre_utilisateur par le nom d'utilisateur Debian approprié :
nano server/update-api.service
nano server/update-site.serviceCopier les services :
sudo cp server/update-api.service /etc/systemd/system/
sudo cp server/update-site.service /etc/systemd/system/Recharger systemd :
sudo systemctl daemon-reloadActiver les services au démarrage :
sudo systemctl enable update-api update-siteLes démarrer :
sudo systemctl start update-api update-siteVérifier leur état :
sudo systemctl status update-api update-siteSi un pare-feu est actif, autoriser les deux ports :
sudo ufw allow 8443/tcp
sudo ufw allow 3000/tcp
sudo ufw reloadLe site fonctionne sur le port HTTP 3000.
Le site génère le ZIP client à la volée à chaque téléchargement.
Il y insère automatiquement :
- l'IP du serveur détectée automatiquement ;
- le token client provenant de
tokens.json; - le certificat SSL
server.crt; - la clé publique RSA
public.pem; - un
config.inientièrement pré-rempli ; client.py;scheduler.py;requirements.txt;LIRE-MOI.txt.
Le client reçoit donc tout ce dont il a besoin dans un seul ZIP et n'a pas de configuration manuelle à effectuer.
update-client/
├── client.py
├── scheduler.py
├── requirements.txt
├── config.ini
├── server.crt
├── public.pem
└── LIRE-MOI.txt
| Fichier | Rôle |
|---|---|
client.py |
Agent principal de mise à jour |
scheduler.py |
Vérification automatique |
requirements.txt |
Dépendances Python |
config.ini |
URL, token et chemins pré-remplis |
server.crt |
Certificat SSL du serveur |
public.pem |
Clé publique RSA |
LIRE-MOI.txt |
Instructions en français |
Le fichier généré ressemble à :
[server]
url = https://192.168.1.42:8443
token = f6e5d4c3b2a1...
server_cert = server.crt
[security]
public_key_path = public.pemL'URL, le token et les chemins sont automatiquement renseignés par le serveur.
Depuis un navigateur Windows connecté au même réseau :
http://192.168.1.42:3000
La page affiche :
- la dernière version disponible ;
- le statut du serveur ;
- un bouton Télécharger le client ;
- les étapes d'installation.
Si certains éléments sont manquants, le site affiche un avertissement.
Exemples :
Certificat SSL manquant -- lancez bash setup-certs.sh
Clé publique manquante -- lancez node setup-keys.js
Le bouton de téléchargement est automatiquement désactivé si le serveur n'est pas complètement configuré.
Depuis Windows, ouvrir :
http://192.168.1.42:3000
Remplacez l'adresse par l'IP affichée par
start-all.sh.
Cliquer sur Télécharger le client.
Enregistrer :
update-client.zip
Puis décompresser le fichier, par exemple dans :
C:\update-client\
Le ZIP contient déjà :
config.iniserver.crtpublic.pem
Aucune modification manuelle de configuration n'est nécessaire.
Si Python n'est pas déjà installé :
- Télécharger Python depuis le site officiel de Python.
- Lors de l'installation, activer Add Python to PATH.
- Vérifier l'installation dans PowerShell :
python --versionLe guide utilise Python 3.11.x comme exemple.
Dans PowerShell :
cd C:\update-client
pip install -r requirements.txtLes dépendances utilisées dans l'exemple du guide incluent notamment :
requests
cryptography
Cette installation n'est nécessaire qu'une seule fois.
cd C:\update-client
python client.pyLe client :
- démarre ;
- vérifie la connectivité au serveur ;
- récupère le manifeste ;
- vérifie sa signature ;
- compare les versions ;
- télécharge la mise à jour ;
- vérifie son hash SHA-256 ;
- crée une sauvegarde ;
- installe la nouvelle version.
Exemple de résultat :
Agent de mise à jour démarré
Vérification de la connectivité serveur...
Serveur joignable
Manifeste reçu : version 1.0.2
Signature du manifeste valide
Version actuelle : 0.0.0
Version disponible : 1.0.2
Téléchargement de update-1.0.2.zip...
Progression : 100.0%
Intégrité vérifiée (SHA-256 OK)
Sauvegarde créée
Version 1.0.2 installée
Mise à jour vers 1.0.2 terminée avec succès !
Le script scheduler.py permet de vérifier automatiquement les nouvelles versions.
Lancer :
python scheduler.pyLe guide utilise un intervalle de :
3600 secondes
60 minutes
Exemple :
Scheduler de mises à jour démarré
Intervalle : 3600 secondes (60 min)
Ctrl+C pour arrêter
Pour lancer automatiquement le scheduler au démarrage de Windows :
Planificateur de tâches → Nouvelle tâche → python C:\update-client\scheduler.py au démarrage de session
Le guide définit 7 scénarios permettant de valider les mécanismes de sécurité.
Depuis Windows, ouvrir :
http://IP:3000
Puis cliquer sur Télécharger.
Le ZIP contient :
config.iniserver.crtpublic.pem
Le fichier config.ini doit contenir l'IP et le token corrects.
Le client est en version 0.0.0 et le serveur propose 1.0.2.
python client.pyLa mise à jour est téléchargée et installée, et state.json est mis à jour.
Relancer :
python client.pyaprès le test précédent.
Déjà à jour.
Aucune action supplémentaire ne doit être effectuée.
Arrêter le serveur Debian avec :
Ctrl+C
Le client indique que le serveur est inaccessible et s'arrête sans modifier les données locales.
Modifier le token dans config.ini avec une valeur incorrecte.
HTTP 403 — Token invalide
Aucun fichier ne doit être téléchargé.
Sur Debian, modifier le champ signature dans :
packages/1.0.2/meta.json
ALERTE : Signature invalide ! Abandon.
Aucune installation ne doit avoir lieu.
Dans meta.json, remplacer la valeur sha256 par une valeur incorrecte, par exemple :
000000...
ALERTE : Hash invalide !
Le fichier temporaire doit être supprimé.
| Fichier | Rôle |
|---|---|
server/server.js |
Serveur API principal — HTTPS 8443 |
server/download-site.js |
Site web de téléchargement — HTTP 3000 |
server/start-all.sh |
Lance les deux serveurs |
server/setup-keys.js |
Génère les clés RSA et tokens |
server/setup-certs.sh |
Génère le certificat SSL |
server/create-package.js |
Ajoute un nouveau paquet de mise à jour |
server/update-api.service |
Service systemd de l'API |
server/update-site.service |
Service systemd du site |
server/tokens.json |
Tokens d'authentification générés |
server/audit.log |
Journal des actions |
keys/private.pem |
Clé privée RSA — NE PAS PARTAGER |
keys/public.pem |
Clé publique RSA distribuée via le ZIP |
certs/server.crt |
Certificat SSL distribué via le ZIP |
certs/server.key |
Clé SSL — NE PAS PARTAGER |
packages/X.Y.Z/ |
Dossier d'une version contenant meta.json et le fichier de mise à jour |
| Fichier | Rôle |
|---|---|
client.py |
Agent principal de mise à jour |
scheduler.py |
Vérification automatique toutes les heures |
config.ini |
Configuration pré-remplie |
requirements.txt |
Dépendances Python |
server.crt |
Certificat SSL du serveur |
public.pem |
Clé publique RSA |
LIRE-MOI.txt |
Instructions en français |
state.json |
Version installée et historique |
client.log |
Journal des opérations |
backups/ |
Sauvegardes avant chaque mise à jour |
app/ |
Dossier d'installation de l'application |
Adresse :
http://IP:3000
Vérifier que le serveur web fonctionne :
ps aux | grep nodeVérifier le port :
sudo ss -tlnp | grep 3000Si nécessaire, ouvrir le port :
sudo ufw allow 3000/tcpTester depuis Debian :
curl http://localhost:3000Exécuter les étapes de configuration nécessaires :
node setup-keys.jspuis :
bash setup-certs.shActualiser ensuite la page web.
Vérifier les logs du site :
tail -f logs/site.logVérifier que client.py existe dans le dossier client/.
Vérifier également les droits :
ls -la keys/ certs/Les fichiers doivent être lisibles par le processus du serveur.
Vérifier que server.crt se trouve dans le même dossier que client.py.
Dans config.ini, vérifier :
server_cert = server.crtPour le mode test indiqué par le guide, il est possible de désactiver la vérification SSL avec :
server_cert = falseLe token présent dans config.ini peut être incorrect.
Le guide recommande :
- supprimer le ZIP ;
- relancer
start-all.sh; - télécharger à nouveau le client ;
- vérifier
tokens.jsonsur le serveur.
Installer les dépendances :
pip install -r requirements.txtVérifier la version de Python :
python --versionPython 3.10+ est requis.
Si plusieurs installations Python sont présentes :
py -3 -m pip install -r requirements.txtps aux | grep nodetail -f ~/update-system/logs/api.logtail -f ~/update-system/logs/site.logcurl http://localhost:3000curl -k https://localhost:8443/healthDans PowerShell :
Test-NetConnection -ComputerName 192.168.1.42 -Port 3000
Test-NetConnection -ComputerName 192.168.1.42 -Port 8443Remplacez
192.168.1.42par l'IP réelle du serveur.
type C:\update-client\client.log| Service | Protocole | Port | Usage |
|---|---|---|---|
| Site de téléchargement | HTTP | 3000 |
Téléchargement du ZIP client |
| API de mise à jour | HTTPS | 8443 |
Vérification et téléchargement des mises à jour |
Les fichiers suivants contiennent des informations sensibles et ne doivent pas être partagés :
keys/private.pem
certs/server.key
server/tokens.json
À l'inverse, les éléments suivants sont destinés à être distribués au client :
keys/public.pem
certs/server.crt
Le client vérifie :
- l'authentification par token ;
- la signature RSA du manifeste ;
- l'intégrité du paquet avec SHA-256 ;
- puis installe la mise à jour après vérification.
sudo apt-get update && sudo apt-get upgrade -y
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs openssl zip curl
unzip serveur-debian.zip -d ~/update-system
cd ~/update-system/server
npm install
chmod +x setup-certs.sh
bash setup-certs.sh
node setup-keys.js
chmod +x create-test-packages.sh
bash create-test-packages.sh
chmod +x start-all.sh
bash start-all.shDepuis le navigateur :
http://IP_DU_SERVEUR:3000
Télécharger puis extraire update-client.zip.
Ensuite :
cd C:\update-client
pip install -r requirements.txt
python client.pyPour la vérification automatique :
python scheduler.py| Problème | Première vérification |
|---|---|
| Site inaccessible | ps aux | grep node et port 3000 |
| Téléchargement désactivé | setup-keys.js + setup-certs.sh |
| Erreur SSL | Présence de server.crt et valeur server_cert |
| HTTP 401/403 | Vérifier le token et régénérer le ZIP |
ModuleNotFoundError |
pip install -r requirements.txt |
| Serveur inaccessible | Vérifier les ports 3000 et 8443 |
| Signature invalide | Vérifier meta.json et la clé publique |
| Hash invalide | Vérifier le champ sha256 dans meta.json |
Ce README est basé sur le document « Système de mises à jour sécurisé — Guide d'installation complet v2 », qui décrit l'architecture, l'installation Debian, le site de téléchargement, le client Windows, les scénarios de sécurité, la référence des fichiers et le dépannage.