- 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
5.8 KiB
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 :
- ✍️ Signature des signataires (OTP + Canvas)
- 📝 Injection des signatures dans le PDF
- 🔒 Scellage PAdES avec
lambda-odentas-pades-sign(KMS) - ⏱️ Horodatage TSA avec
lambda-tsaStamp(RFC3161 Sectigo) - 📦 Evidence bundle mis à jour avec les hashes et métadonnées
- 💾 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 :
- Crée une demande avec
create-real-signature.js - Signe avec les 2 signataires (Employeur + Salarié)
- Déclenche automatiquement le webhook de completion
- 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 :
- Télécharger le PDF source depuis S3
- Télécharger toutes les images de signature
- Injecter les signatures aux coordonnées spécifiées (avec pdf-lib ou PDFBox)
- Créer un certificat X.509 (ou utiliser existant)
- Signer le PDF avec KMS (RSASSA_PSS_SHA_256)
- Appliquer le sceau PAdES-B-LTA
- 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 :
- Créer une Time-Stamp Request (TSR) RFC3161
- Contacter le TSA Sectigo (https://timestamp.sectigo.com)
- Récupérer le Time-Stamp Token
- 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
- Souveraineté : 100% contrôlé, aucune dépendance externe (sauf TSA)
- Conformité eIDAS : PAdES-B-LTA avec horodatage qualifié
- Traçabilité : Evidence bundle complet avec tous les événements
- Sécurité : KMS AWS pour le scellage, Object Lock pour l'archivage
- Performance : Workflow asynchrone avec Lambdas
- 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)