Aller au contenu principal

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/node et @jodaprint/protocol l'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.1 et ::1, sur wss://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).