ImagSign — Firma Digital y Electronica
Proposito
ImagSign es el servicio de firma digital y electronica de la plataforma Imagy. Permite solicitar, ejecutar y verificar firmas sobre documentos, tanto de forma independiente (standalone) como integrada dentro de flujos de ImagFlow. Abstrae multiples proveedores de firma mediante un patron adapter, permitiendo al platform admin elegir el proveedor adecuado segun el pais, tipo de firma y requisitos legales.
Responsabilidades
| Responsabilidad | Descripcion |
|---|---|
| Solicitud de firma | Crear solicitudes de firma sobre uno o mas documentos |
| Gestion de documentos | Almacenar referencias a documentos en S3, controlar versiones firmadas |
| Multi-proveedor | Adapter pattern para Firmalo, Uanataca, Certicamara y firma electronica generica |
| Firma digital | Firma con certificado digital (validez legal plena) |
| Firma electronica | Firma por OTP, biometria o aceptacion simple |
| Ciclo de vida | Controlar estados del documento y la solicitud |
| Auditoria | Registro inmutable de cada accion sobre la firma |
| Eventos | Publicar eventos cuando una firma se completa, rechaza o expira |
| URL publica de firma | Generar link seguro para que el firmante ejecute la firma sin autenticacion |
Actores
| Actor | Interaccion con ImagSign |
|---|---|
| Platform Admin | Configura proveedores de firma. Define que proveedor usar en cada flujo. |
| Operator | Crea solicitudes de firma standalone (ad-hoc). |
| Firmante | Ejecuta la firma via link publico (sin autenticacion, usa signing_token). |
| ImagFlow | Invoca ImagSign como paso de firma dentro de un flujo. |
| ImagLend | Invoca ImagSign para firma de contratos de credito. |
Modos de Operacion
Standalone (Ad-hoc)
El operador crea una solicitud de firma directamente en ImagSign. Se genera un link publico que se envia al firmante. No hay dependencia de ImagFlow.
Integrado (como paso de ImagFlow)
ImagFlow invoca ImagSign cuando un flujo tiene un paso de tipo signature. ImagSign ejecuta la firma y publica un evento que ImagFlow consume para continuar la ejecucion.
Tipos de Firma
Firma Digital (con certificado)
Firma con certificado digital emitido por una autoridad certificadora. Tiene validez legal plena y no repudio.
| Proveedor | Pais | Tipo de certificado |
|---|---|---|
| Firmalo | Ecuador | Certificado en la nube |
| Uanataca | Ecuador | Certificado centralizado |
| Certicamara | Colombia | Certificado en la nube |
Firma Electronica
Firma sin certificado digital. Menor peso legal pero mas accesible.
| Subtipo | Mecanismo | Nivel de seguridad |
|---|---|---|
| OTP | Codigo enviado por SMS/email, firmante lo ingresa | Medio |
| Biometrica | Captura de firma manuscrita en pantalla | Medio |
| Aceptacion simple | Click en boton de aceptacion | Bajo |
Firma Electronica Avanzada (con evidencia biometrica)
Firma electronica enriquecida con datos de validacion de identidad de ImagFlow. Tiene mayor peso legal porque incluye evidencia criptografica de que el firmante fue validado biometricamente.
| Componente | Descripcion |
|---|---|
| Evidence bundle | Datos biometricos del proceso de validacion (score, timestamp, geo) |
| Liveness proof | Hash de la imagen del liveness verificado |
| Document match | Score del match facial (selfie vs documento) |
| Device attestation | Fingerprint y geolocalizacion del dispositivo usado |
| Timestamp certificado | Estampado cronologico del momento de la firma |
El evidence_bundle se adjunta al documento firmado como paquete de evidencia separado, demostrando que la persona que firmo fue validada biometricamente por ImagFlow.
Firma por Dispositivo Certificado
Firma ejecutada desde un dispositivo previamente registrado y validado. Usa criptografia asimetrica (keypair en Secure Enclave) y biometria local (FaceID/TouchID).
Propiedades:
- La clave privada nunca sale del dispositivo (no repudio)
- La firma es sobre el hash del documento especifico (integridad)
- Biometria local al momento de firmar (autenticacion)
- El dispositivo fue validado con biometria real de ImagFlow (identidad)
Multiples Firmantes
ImagSign soporta solicitudes con multiples firmantes. Cada firmante tiene su propio token, estado y puede firmar independientemente.
Modelo
Estrategias para Multiples Firmantes
El problema: en firma digital PKI, agregar una firma puede invalidar las anteriores si el documento se modifica. ImagSign ofrece tres estrategias:
| Estrategia | Descripcion | Cuando usar |
|---|---|---|
incremental_pdf | Firma incremental sobre el PDF (cada firma es una capa) | Proveedores que soportan PAdES (Firmalo, Uanataca, Certicamara) |
evidence_package | Cada firmante genera evidencia separada, no modifica el PDF | Firma electronica, dispositivo certificado |
sequential_copies | Cada firmante firma su propia copia, se consolida al final | Fallback cuando el proveedor no soporta incremental |
Configuracion
{
"multi_signer_strategy": "incremental_pdf",
"signing_order": "parallel",
"signers": [
{
"role": "debtor",
"name": "Juan Perez",
"email": "juan@email.com",
"identifier": "1234567890",
"signature_type": "digital_certificate",
"provider_code": "certicamara-co"
},
{
"role": "co_debtor",
"name": "Maria Garcia",
"email": "maria@email.com",
"identifier": "0987654321",
"signature_type": "electronic_device",
"provider_code": "imagy-device"
},
{
"role": "witness",
"name": "Carlos Lopez",
"email": "carlos@email.com",
"identifier": "1122334455",
"signature_type": "electronic_otp"
}
]
}| Campo | Descripcion |
|---|---|
multi_signer_strategy | Estrategia para manejar multiples firmas |
signing_order | parallel (cualquier orden) o sequential (orden forzado) |
signers[].role | Rol del firmante en el documento |
signers[].signature_type | Tipo de firma para este firmante especifico |
Validacion de Integridad
Antes de permitir una nueva firma, ImagSign verifica:
- Si la estrategia es
incremental_pdf: valida que las firmas anteriores siguen intactas - Si alguna firma anterior se invalido: rechaza la operacion y notifica
- Si el proveedor no soporta firma incremental: fuerza estrategia
evidence_package
Arquitectura de Proveedores (Adapter Pattern)
ImagSign usa el mismo patron que el Provider Gateway de ImagFlow: una interfaz comun por tipo de servicio, con adapters concretos por proveedor.
Cada adapter implementa la interfaz ISignatureProvider:
public interface ISignatureProvider
{
string ProviderCode { get; }
SignatureType SupportedType { get; }
Task<InitiateResult> InitiateSignatureAsync(InitiateRequest request, CancellationToken ct);
Task<SignatureStatus> GetStatusAsync(string externalId, CancellationToken ct);
Task<SignedDocument> GetSignedDocumentAsync(string externalId, CancellationToken ct);
Task<CancelResult> CancelAsync(string externalId, CancellationToken ct);
}Integracion con Otros Dominios
ImagSign como proveedor de servicios
| Consumidor | Como usa ImagSign | Endpoint |
|---|---|---|
| ImagFlow | Ejecuta firma como paso del flujo | POST /api/v1/signature-requests (internal) |
| ImagLend | Firma de contratos de credito | POST /api/v1/signature-requests (internal) |
ImagSign como consumidor
ImagSign no consume eventos directamente. Es invocado via HTTP por ImagFlow e ImagLend.
Ciclo de Vida del Documento
| Estado | Descripcion |
|---|---|
created | Documento subido a S3, aun no asociado a una solicitud activa |
pending_signature | Solicitud de firma creada, esperando accion del firmante |
signed | Firma completada exitosamente, documento firmado disponible |
expired | El tiempo limite para firmar se agoto |
revoked | La solicitud fue cancelada por el operador o el sistema |
Eventos Producidos
| Evento | Routing Key | Consumidores |
|---|---|---|
| Firma completada | sign.signature.completed | ImagFlow |
| Firma rechazada | sign.signature.rejected | ImagFlow |
| Firma expirada | sign.signature.expired | ImagFlow, ImagLend |
Eventos Consumidos
ImagSign no consume eventos de otros dominios. Es invocado directamente via HTTP.
Repositorio
- Repo:
imagy-sign - Base de datos:
imagy_sign - Puerto local: 4003
- Equipo: Team Sign
Documentos Relacionados
- Modelo de Datos — Tablas, relaciones, almacenamiento de documentos
- API Reference — Endpoints publicos, internos y de firma
- Eventos — Eventos producidos con payloads completos