- 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
236 lines
5.8 KiB
Markdown
236 lines
5.8 KiB
Markdown
# 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)
|