- PHP 91.4%
- CSS 6.7%
- JavaScript 1.3%
- Python 0.6%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| assets | ||
| bin | ||
| deploy/cron.d | ||
| lib | ||
| socle | ||
| tests | ||
| .gitignore | ||
| activer.php | ||
| admin.php | ||
| api.php | ||
| auth.php | ||
| config.php | ||
| connexion.php | ||
| CONTRIBUTING.md | ||
| db.php | ||
| deconnexion.php | ||
| deposer.php | ||
| document.php | ||
| dossier.php | ||
| index.php | ||
| LICENSE | ||
| NOTICE | ||
| portail.php | ||
| README.md | ||
| verifier.php | ||
Parapheur électronique
Circuit de signature pour les agents et les élus des quatre collectivités — Ville de Millau, Communauté de communes Millau Grands Causses, CCAS, Office de tourisme.
Deux entrées, une seule mécanique : le dépôt d'un document par une personne, et l'appel d'une application interne qui veut faire signer ce qu'elle produit (compte-rendu d'entretien, bon de commande, arrêté…). Rien ne justifie de réécrire un circuit de signature dans chaque outil.
Ce que ça établit, et ce que ça n'établit pas
Chaque geste — dépôt, visa, signature, refus — laisse un maillon dans la chaîne
de preuve du socle (socle/preuve.php) : identité figée de l'acteur, méthode
d'authentification réellement employée, empreinte des documents, instant en UTC,
origine. Le maillon est scellé, chaîné au précédent, et la racine sort
périodiquement de la machine.
Cela établit le geste. Cela n'établit pas l'identité de la personne physique au sens juridique : au sens du règlement eIDAS, le dispositif relève de la signature avancée. Seul le niveau qualifié est présumé équivalent à une signature manuscrite (article 25.2), et il s'achète auprès d'un prestataire qualifié — il ne se fabrique pas avec une autorité de certification interne.
D'où le partage assumé : le flux courant passe par la chaîne de preuve, à coût nul et volume illimité ; les actes à enjeu reçoivent en plus un certificat qualifié, acheté pour les seuls détenteurs de délégation.
Le circuit appartient à la collectivité
Un circuit est défini par collectivité — ni par type de document, ni par service. Chaque collectivité décrit qui signe et dans quel ordre ; plusieurs circuits par collectivité restent possibles (un ordinaire, un pour les urgences).
Un dossier ne pointe pas vers son circuit : il en garde une copie. Sans cela, modifier un circuit réécrirait après coup le parcours de dossiers déjà signés, et la preuve porterait sur un circuit qui ne s'est jamais appliqué. Le banc d'essai vérifie précisément ce point.
États d'un dossier
brouillon ──mise en circuit──> en_circuit ──dernier geste──> signé
│
└──refus motivé──> refusé
Le brouillon existe pour joindre les pièces et relire le circuit avant que quiconque soit sollicité : rien n'est notifié tant que le dossier n'est pas mis en circuit. Après la mise en circuit, plus aucune pièce ne peut être ajoutée — ce sur quoi on a signé ne doit pas pouvoir changer ensuite.
Sécurité
- Publié sur Internet, contrairement aux autres outils métier : les élus signent depuis chez eux, sur leur propre matériel. Second facteur obligatoire au geste de signature.
- Les documents sont déposés hors de la racine web et servis par un script qui contrôle les droits. Le type est déduit du contenu, jamais de l'extension.
- Toute décision d'état est prise côté serveur, à partir de la base : c'est le serveur qui décide de qui est le tour.
- La preuve est écrite avant le changement d'état, dans la même transaction : si la preuve échoue, le geste n'a pas lieu.
Comment on entre
| Population | Chemin | Second facteur |
|---|---|---|
| Agents | SSO du portail intranet (portail.php) |
TOTP ou code par courriel, au choix |
| Élus | compte nominatif local (connexion.php) |
TOTP, obligatoire |
| Applications | api.php, clé en en-tête X-Api-Key |
— elles ne signent pas |
| N'importe qui | verifier.php — sans compte |
— |
Une application peut déposer et suivre, jamais signer : un geste de signature suppose une personne et un second facteur.
verifier.php est publique à dessein : une preuve qui n'est opposable qu'à ceux
qui ont un compte n'est pas opposable. Le PDF déposé pour vérification ne quitte
pas le poste du visiteur — son empreinte est calculée dans son navigateur.
Mise en service
php bin/amorcer.php # schéma + les quatre collectivités et leur identité
cp deploy/cron.d/parapheur-ancrage /etc/cron.d/
Puis dans config.local.php, au minimum : DB_*, APP_SECRET, SITE_URL,
SSO_SECRET_PARAPHEUR, et au moins une sortie d'ancrage (ANCRAGE_FICHIER,
ANCRAGE_MAIL ou TSA_URL) — sans elle, l'ancrage ne protège pas d'une
réécriture de la base.
Facultatif : CACHET_SIGNEUR et CACHET_DIR pour sceller les PDF (PAdES, un
certificat par collectivité). Sans eux, le dossier reste signé et prouvé par la
chaîne — le cachet ajoute la vérifiabilité dans un simple lecteur PDF.
Vérifier
php tests/circuit.php # cycle de vie complet, base jetable (MariaDB local)
php tests/compte.php # comptes des élus : activation, 2FA, blocage
php tests/ecrans.php # chaque écran dans un vrai serveur PHP jetable
php bin/ancrer.php # vérifie la chaîne et pose une ancre (tâche planifiée)
Licence
GNU GPL v3 — voir LICENSE.