Sécurité et signature
Une imprimante posée sur le comptoir d'une boutique ne doit imprimer que ce qu'envoie le logiciel de la boutique. JodaPrint l'impose à plusieurs niveaux.
Signature des requêtes (par défaut)
Chaque organisation crée une ou plusieurs clés de signature Ed25519 dans le tableau de bord. La clé privée n'est affichée qu'une fois et reste sur votre backend ; la clé publique est envoyée à vos agents avec leur configuration.
Le SDK navigateur ne détient jamais de clé privée. Pour chaque requête, il appelle votre signer, qui demande à votre backend de signer (voir Première impression depuis le navigateur). L'agent vérifie ensuite :
-
la signature, calculée sur cette chaîne :
v1{method}{orgId}{ts}{nonce}{sha256_hex(canonical_json(params))}Le JSON canonique suit la RFC 8785 (JCS) : clés triées, sans espaces.
@jodaprint/nodeet@jodaprint/protocoll'implémentent. -
l'horodatage : une signature de plus de 300 secondes est refusée (
SIGNATURE_EXPIRED) ; -
le nonce : un nonce déjà vu au cours des 10 dernières minutes est refusé (
NONCE_REUSED).
Votre point d'accès de signature décide qui peut imprimer : signRequestHandler exige un callback authorize et peut limiter les méthodes qu'il signe.
Pour renouveler une clé, créez-en une nouvelle, déployez-la sur votre backend, puis révoquez l'ancienne.
Origines autorisées
L'agent refuse les connexions WebSocket des pages dont l'origine ne figure pas dans la liste de l'organisation (ORIGIN_NOT_ALLOWED). Avec le mode développeur activé, http://localhost:* est aussi autorisé ; désactivez-le en production.
Mode non signé (facultatif)
Pour les petites entreprises sans backend, une organisation peut activer le mode non signé. Quand une origine autorisée envoie une requête non signée, l'icône de la zone de notification demande à la personne devant l'ordinateur : Autoriser, Bloquer ou Toujours autoriser. Le choix est enregistré par site. Ce mode est désactivé par défaut.
Connexion locale
- L'agent écoute uniquement sur
127.0.0.1et::1, surwss://localhost:8182(puis 8283, 8384, 8485). - À l'installation, l'agent crée une autorité de certification propre à cette machine, limitée aux noms
localhost, et lui fait confiance. La clé privée de l'autorité ne quitte jamais la machine ; aucun certificat ni aucune clé n'est partagé entre clients.
Les appareils et le cloud
- À l'activation, chaque agent crée une clé d'appareil Ed25519 ; il prouve son identité à chaque connexion en signant un défi envoyé par le cloud.
- C'est toujours l'agent qui ouvre la connexion (sortante). Le cloud ne se connecte jamais à l'intérieur de votre réseau.
- L'agent ne fait qu'imprimer : pas de shell à distance, pas de lecture de fichiers en dehors de ses propres dossiers, pas d'exécution de programmes, sauf l'outil PDF fourni avec lui.
- Les mises à jour sont signées : l'agent vérifie chaque version avec la clé de publication JodaPrint intégrée, et revient à la version précédente si une nouvelle version ne démarre pas.
Cloud
- Les clés d'API (
jp_live_…,jp_test_…) sont stockées sous forme de hachages SHA-256 ; seuls les premiers caractères sont conservés pour les reconnaître. Donnez à chaque clé uniquement les portées dont elle a besoin. - Isolation des organisations : chaque clé d'API, appareil, imprimante et travail appartient à une seule organisation, et chaque requête filtre sur celle-ci.
- Le contenu des travaux est chiffré au repos (AES-256-GCM) et supprimé après la durée de conservation de l'organisation (7 jours par défaut ; 0, 1, 7, 30 ou 90). Les métadonnées des travaux restent pour l'historique.
- Limites de débit : par défaut 20 travaux par seconde par appareil et 100 requêtes par seconde par clé d'API.
- Les webhooks sont signés en HMAC-SHA256 : voir Webhooks.
Modèle de menaces et signalement
Le modèle de menaces complet (un tableau STRIDE par composant, avec les tests qui couvrent chaque menace) se trouve dans docs/security.md du dépôt JodaPrint. Signalez les vulnérabilités en privé à [email protected] (voir SECURITY.md).