DTL_LicenseServer — Manuel de référence
Description fonctionnelle et technique du service de licences
Préface
DTL_LicenseServer est un service léger de gestion de licences destiné aux applications Windows. Il centralise la création des licences, l’autorisation des machines, la validation en ligne et la révocation, tout en évitant de placer les secrets du serveur ou un accès direct à la base de données dans le logiciel distribué.
Ce manuel constitue la référence descriptive du produit : il expose ses responsabilités, son architecture, ses données, ses interfaces et ses garanties. Il s’adresse aux responsables techniques, développeurs, exploitants et personnes chargées d’évaluer le système.
Contexte et périmètre
Finalité
Le service associe un droit d’utilisation à un produit, une adresse électronique et un nombre maximal de machines. Il décide si une machine peut recevoir ou conserver une activation et produit un jeton signé attestant cette décision.
Frontières de confiance
- L’application cliente connaît l’URL publique et les informations de licence, mais jamais la clé privée de signature ni les identifiants MariaDB.
- L’outil d’administration possède une clé d’API réservée à la création de licences.
- Le serveur PHP porte la logique d’autorisation et signe les jetons.
- MariaDB conserve l’état de référence des produits, licences, activations et événements.
Responsabilités exclues
DTL_LicenseServer n’est ni un système de paiement, ni un portail client, ni un annuaire d’identités. Il ne fournit pas d’interface graphique d’administration et ne remplace pas les contrôles d’accès, la sauvegarde ou la supervision de l’hébergement.
Architecture
API serveur
PHP 8.1+JSONHTTPSExpose les opérations de santé, d’activation, de validation, de désactivation et de création administrative. La bibliothèque commune applique les contrôles, accède aux données et gère les signatures.
Base de données
MariaDBInnoDButf8mb4Constitue la source d’autorité sur l’état d’une licence et de ses machines. Le schéma distribué se trouve dans database/netdtl_licenses.sql.
Outil d’administration
Python 3.10+Ligne de commandeCrée des licences par l’interface administrative et affiche la clé en clair une seule fois. Ses messages sont disponibles en français et en anglais.
Client embarquable
PythonWindowsCalcule une empreinte stable de la machine, dialogue avec le service et conserve le jeton d’activation signé ainsi que les métadonnées de contrôle.
Cycle de vie d’une licence
Création
Une licence appartient à un produit et possède un courriel de référence, un état, une échéance facultative et un plafond d’activations. La clé en clair n’est renvoyée qu’à la création ; seule son empreinte SHA-256 est conservée ensuite.
Activation et actualisation
Le serveur vérifie le produit, la clé, le courriel, l’état, l’échéance et le quota. Une première machine obtient une ligne d’activation et un jeton Ed25519. Une demande ultérieure de la même machine non révoquée actualise ses informations sans consommer de place supplémentaire.
Désactivation et réactivation
La désactivation date la révocation de l’activation ; son jeton n’est alors plus valide. Si la même machine présente de nouveau les justificatifs de licence et qu’une place est disponible, le serveur réutilise sa ligne, efface la date de révocation et émet un nouveau jeton. Le quota est contrôlé avant cette réactivation.
États
| État | Signification |
|---|---|
| active | La licence peut autoriser et valider des machines, sous réserve des autres contrôles. |
| suspended | Le droit est temporairement neutralisé. |
| revoked | Le droit a été retiré. |
| expired | L’échéance de la licence est dépassée. |
Modèle de données
| Objet | Rôle |
|---|---|
| products | Catalogue des produits pouvant recevoir des licences, avec code et état d’activation. |
| licenses | Identité du client, empreinte de la clé, état, échéance, quota et notes. |
| activations | Association entre une licence et une empreinte de machine, informations clientes et éventuelle révocation. |
| license_events | Historique des créations, décisions d’activation, refus et validations, avec contexte réseau. |
| admin_users | Structure réservée par le schéma ; elle n’est pas utilisée par l’API actuelle. |
| license_status | Vue de synthèse facilitant la lecture de l’état et du nombre d’activations. |
Jeton d’activation
Le jeton signé relie une décision à un produit, une licence, une activation et une machine. Sa charge utile comprend la version du format, product_code, license_id, activation_id, machine_id_hash et issued_at. Sa signature protège l’intégrité ; l’état courant reste vérifié côté serveur.
Capacités fonctionnelles
- Création d’une licence pour un produit actif, avec quota et échéance facultative.
- Activation initiale, actualisation d’une machine connue et réactivation contrôlée d’une machine révoquée.
- Validation en ligne de la signature, de la machine, de l’activation et de la licence.
- Désactivation d’une machine et invalidation de son jeton.
- Journalisation des événements significatifs et diagnostic de santé du service.
- Messages français et anglais pour les outils Python fournis.
Le produit d’exemple du schéma porte le code MYPRODUCT et le nom MyProduct. Il illustre le caractère générique du service et n’impose pas le nom du logiciel licencié.
Interface de service
Toutes les réponses utilisent JSON. L’interface distingue l’observation de santé, les opérations portant sur une activation et la création administrative.
| Point d’entrée | Méthode | Protection | Responsabilité |
|---|---|---|---|
| health.php | GET | Aucune | État du service et de la connexion MariaDB. |
| activate.php | POST | Clé de licence + courriel | Activation, actualisation ou réactivation d’une machine. |
| validate.php | POST | Jeton signé | Validation en ligne d’une activation existante. |
| deactivate.php | POST | Jeton signé | Révocation de la machine courante. |
| admin_create_license.php | POST | X-Admin-Key | Création administrative d’une licence. |
Classes de réponse
Les succès ordinaires utilisent les classes HTTP 200 et 201. Les requêtes invalides, authentifications absentes, refus de licence, objets inconnus et conflits de quota relèvent des classes 400. Les erreurs de configuration, signature ou base de données relèvent des classes 500. Les réponses contiennent un indicateur de succès et, en cas de refus, un code d’erreur stable.
Modèle de sécurité
- Transport : HTTPS protège la confidentialité et l’authenticité des échanges.
- Signature : Ed25519 rend détectable toute altération d’un jeton.
- Minimisation : les clés de licence et identifiants matériels bruts ne sont pas conservés par le serveur ; leurs empreintes SHA-256 le sont.
- Administration : la création de licences est séparée et protégée par
X-Admin-Key. - Secrets :
server/config.phpcontient les identifiants MariaDB, la clé d’administration et la clé privée ; il appartient à la frontière de confiance de l’hébergement. - Traçabilité : les événements enregistrent notamment le type de décision et l’adresse IP reçue par PHP.
Composants internes
| Composant | Responsabilité |
|---|---|
| server/lib.php | Configuration, connexion, réponses JSON, contrôles communs, jetons et journalisation. |
| server/activate.php | Décision d’activation, application du quota et émission du jeton. |
| server/validate.php | Contrôle cryptographique et cohérence avec les données courantes. |
| server/deactivate.php | Révocation de l’activation désignée par le jeton. |
| server/admin_create_license.php | Création protégée et restitution unique de la clé en clair. |
| server/health.php | Identification de la version et état de MariaDB. |
| admin/DTLlicense.py | Client administratif en ligne de commande. |
| client/dtl_license_client.py | Empreinte Windows, appels au service et persistance locale du jeton. |
| dtl_licenseserver_i18n.py | Catalogue bilingue partagé par les outils Python. |
Invariants
- Un produit doit exister et être actif avant qu’une licence puisse être délivrée pour son code.
- Une activation non révoquée occupe une place dans le quota ; une activation révoquée n’en occupe pas.
- Le jeton, la machine et la ligne d’activation doivent se désigner mutuellement.
- Une clé de licence en clair n’est pas récupérable depuis la base après sa création.
Limites connues
- Le client fourni enregistre
next_check_daysetoffline_grace_days, mais ne décide pas encore lui-même de l’autorisation hors ligne. - Les paramètres de fenêtre et de plafond des tentatives d’activation existent dans la configuration, mais ne sont pas appliqués par les scripts actuels.
- L’outil d’administration crée des licences ; il ne fournit pas encore de commandes de liste, suspension, révocation ou réactivation.
- Le client fourni est propre à Windows.
- Le dépôt ne contient pas encore de suite de tests automatisés.
La version du service est 1.0.6. Toute évolution du protocole, du schéma ou de la charge utile des jetons doit préserver la compatibilité ou annoncer explicitement sa rupture.
Glossaire
| Terme | Définition |
|---|---|
| Licence | Droit accordé pour un produit, un client et un nombre maximal de machines. |
| Activation | Association persistante entre une licence et l’empreinte d’une machine. |
| Jeton | Attestation signée émise par le serveur pour une activation. |
| Empreinte | Condensat SHA-256 dérivé des identifiants disponibles sur la machine Windows. |
| Révocation | État d’une activation dont le jeton ne doit plus être accepté. |
| Quota | Nombre maximal d’activations simultanément non révoquées. |