# Test Complet : Signature + PAdES + TSA ## ✅ Modifications appliquées Le bypass du mode test a été **retiré** du webhook `/api/odentas-sign/webhooks/completion/route.ts`. Maintenant, **toutes les demandes de signature** (test ou production) déclenchent le workflow complet : 1. ✍️ **Signature des signataires** (OTP + Canvas) 2. 📝 **Injection des signatures** dans le PDF 3. 🔒 **Scellage PAdES** avec `lambda-odentas-pades-sign` (KMS) 4. ⏱️ **Horodatage TSA** avec `lambda-tsaStamp` (RFC3161 Sectigo) 5. 📦 **Evidence bundle** mis à jour avec les hashes et métadonnées 6. 💾 **Stockage S3** avec Object Lock (10 ans) --- ## 🚀 Tester en local ### Prérequis Les Lambdas doivent être lancées localement (ou déployées) : ```bash # Terminal 1 : Lambda PAdES cd lambda-odentas-pades-sign docker build -t lambda-pades . docker run -p 9000:8080 lambda-pades # Terminal 2 : Lambda TSA cd lambda-tsaStamp docker build -t lambda-tsa . docker run -p 9001:8080 lambda-tsa # Terminal 3 : Next.js npm run dev ``` ### Variables d'environnement Ajouter dans `.env.local` : ```bash # URLs des Lambdas (local ou AWS) LAMBDA_PADES_URL=http://localhost:9000/2015-03-31/functions/function/invocations LAMBDA_TSA_URL=http://localhost:9001/2015-03-31/functions/function/invocations # KMS et TSA KMS_KEY_ID=alias/odentas-sign TSA_URL=https://timestamp.sectigo.com ``` ### Script de test automatique ```bash ./test-complete-signature-flow.sh ``` Ce script : 1. Crée une demande avec `create-real-signature.js` 2. Signe avec les 2 signataires (Employeur + Salarié) 3. Déclenche automatiquement le webhook de completion 4. Affiche les logs du workflow PAdES + TSA --- ## 📊 Logs à surveiller Dans le terminal Next.js, vous devriez voir : ``` [WEBHOOK COMPLETION] Début traitement pour request xxx [WEBHOOK] 🔒 Début du workflow de scellage... [WEBHOOK] 📝 Appel de lambda-odentas-pades-sign... [WEBHOOK] Payload PAdES: { "source_s3_key": "source/...", "signatures": [...], "output_key": "signed/REAL-xxx.pdf" } [WEBHOOK] ✅ PAdES seal appliqué [WEBHOOK] ⏱️ Appel de lambda-tsaStamp... [WEBHOOK] ✅ TSA timestamp obtenu [WEBHOOK] ✅ Evidence bundle mis à jour [WEBHOOK] ✅ Workflow de scellage terminé [WEBHOOK COMPLETION] ✅ Traitement terminé pour REAL-xxx ``` Si les Lambdas ne sont pas disponibles : ``` [WEBHOOK] ⚠️ Lambda PAdES non accessible (normal en local) [WEBHOOK] ⚠️ PAdES seal skipped (Lambda non disponible en local) [WEBHOOK] ⚠️ Lambda TSA non accessible (normal en local) [WEBHOOK] ⚠️ TSA timestamp skipped (Lambda non disponible en local) ``` --- ## 🔍 Vérification dans S3 Après le test complet, vérifier les fichiers créés : ```bash # Evidence bundle aws s3 ls s3://odentas-sign/evidence/REAL-xxx/ # Signatures des signataires aws s3 ls s3://odentas-sign/signatures/REAL-xxx/ # PDF signé et scellé aws s3 ls s3://odentas-sign/signed/ # TSR (Time-Stamp Response) aws s3 ls s3://odentas-sign/certs/ ``` --- ## 🔒 Workflow PAdES détaillé ### 1. Lambda `lambda-odentas-pades-sign` **Input** : ```json { "source_s3_key": "source/REAL-xxx.pdf", "signatures": [ { "signer_id": "uuid-1", "s3_key": "signatures/REAL-xxx/uuid-1.png", "positions": [ { "page": 3, "x": 70, "y": 120, "width": 180, "height": 70 } ] } ], "output_key": "signed/REAL-xxx.pdf" } ``` **Actions** : 1. Télécharger le PDF source depuis S3 2. Télécharger toutes les images de signature 3. Injecter les signatures aux coordonnées spécifiées (avec pdf-lib ou PDFBox) 4. Créer un certificat X.509 (ou utiliser existant) 5. Signer le PDF avec KMS (RSASSA_PSS_SHA_256) 6. Appliquer le sceau PAdES-B-LTA 7. Uploader le PDF signé vers S3 **Output** : ```json { "signed_pdf_key": "signed/REAL-xxx.pdf", "pdf_sha256": "abc123...", "certificate": "MII..." } ``` ### 2. Lambda `lambda-tsaStamp` **Input** : ```json { "pdf_s3_key": "signed/REAL-xxx.pdf", "hash_to_timestamp": "abc123..." } ``` **Actions** : 1. Créer une Time-Stamp Request (TSR) RFC3161 2. Contacter le TSA Sectigo (https://timestamp.sectigo.com) 3. Récupérer le Time-Stamp Token 4. Uploader le TSR vers S3 **Output** : ```json { "tsr_s3_key": "certs/REAL-xxx.tsr", "serial_number": "0x123ABC", "policy_oid": "1.3.6.1.4.1.6449.1.2.1", "timestamp": "2025-10-27T18:30:00Z" } ``` --- ## 📦 Evidence Bundle final Après le workflow complet, `evidence/REAL-xxx/bundle.json` contient : ```json { "request_id": "uuid", "request_ref": "REAL-1234567890", "title": "Contrat CDDU - Jean DUPONT", "eidas_level": "SES", "seal": { "algorithm": "RSASSA_PSS_SHA_256", "kms_key_id": "alias/odentas-sign", "sealed_at": "2025-10-27T18:30:00Z", "pdf_sha256": "abc123..." }, "tsa": { "url": "https://timestamp.sectigo.com", "tsr_sha256": "def456...", "policy_oid": "1.3.6.1.4.1.6449.1.2.1", "serial": "0x123ABC" }, "retention": { "archive_key": "signed/REAL-xxx.pdf", "retain_until": "2035-10-27T18:30:00Z", "compliance_mode": "COMPLIANCE" }, "signers": [...], "events": [...] } ``` --- ## ✅ Avantages du système complet 1. **Souveraineté** : 100% contrôlé, aucune dépendance externe (sauf TSA) 2. **Conformité eIDAS** : PAdES-B-LTA avec horodatage qualifié 3. **Traçabilité** : Evidence bundle complet avec tous les événements 4. **Sécurité** : KMS AWS pour le scellage, Object Lock pour l'archivage 5. **Performance** : Workflow asynchrone avec Lambdas 6. **Coût** : Pas de frais de service tiers (DocuSeal, etc.) --- ## 🚨 Notes importantes - En local sans Lambdas, le workflow se termine quand même (graceful degradation) - Les Lambdas peuvent être déployées sur AWS Lambda ou tout autre runtime Docker - Le TSA Sectigo est gratuit et conforme RFC3161 - Le scellage PAdES nécessite un certificat X.509 valide (auto-signé pour tests OK)