espace-paie-odentas/TEST_PADES_TSA.md
odentas 40ab28fdc7 feat: Activation du workflow complet PAdES + TSA
- Retrait du bypass mode test dans le webhook completion
- Appel des Lambdas pades-sign et tsaStamp pour toutes les demandes
- Workflow complet: signature → PAdES seal → TSA timestamp → archive
- Graceful degradation si Lambdas non disponibles (local)
- Evidence bundle mis à jour avec hash PDF et TSA metadata
- Script de test automatique test-complete-signature-flow.sh
- Documentation complète TEST_PADES_TSA.md
2025-10-27 19:35:04 +01:00

5.8 KiB

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) :

# 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 :

# 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

./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 :

# 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 :

{
  "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 :

{
  "signed_pdf_key": "signed/REAL-xxx.pdf",
  "pdf_sha256": "abc123...",
  "certificate": "MII..."
}

2. Lambda lambda-tsaStamp

Input :

{
  "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 :

{
  "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 :

{
  "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)