SIBEL — Manual Técnico
Firma XAdES-BES Detached + ASiC-E (Referencia directa al PDF)
v2.0 (19/Sep/2025)
Resumen ejecutivo
SIBEL implementa firma electrónica avanzada basada en XAdES-BES (perfil Baseline-B) sobre documentos PDF empaquetados en un contenedor ASiC-E. La firma es de tipo detached con referencia directa al PDF (sin usar ds:Manifest), maximizando la interoperabilidad con validadores como DSS de la Comisión Europea. El sistema opera 100% en local (offline) y permite cofirmas múltiples en el mismo contenedor, generación de un PDF representativo y registro de auditoría.
1. Alcance y objetivos
- Proveer una firma XAdES-BES (Baseline-B) detached para PDF dentro de ASiC-E.
- Permitir cofirmas (múltiples ds:Signature) sobre el mismo documento.
- Mantener portabilidad y operación offline, sin dependencias de terceros.
- Facilitar la validación externa y el soporte probatorio mediante XML de firma y PDF representativo.
2. Arquitectura general
- Capa Cripto: .NET Framework 4.7.2 / System.Security.Cryptography / BouncyCastle (lectura de .cer/.key).
- Capa XAdES: construcción explícita de ds:Signature, ds:SignedInfo, xades:SignedProperties y ds:Object.
- Contenedor: ASiC-E (ZIP) con mimetype (stored) + PDF en raíz + META-INF/signatures0.xml.
- UI WinForms: flujo 3 pasos (Documento → Certificado → Firmar/Cofirmar) con atajos y BusyDialog.
3. Modelo de firma (XAdES-BES Baseline-B)
- Tipo: Detached con referencia directa al PDF (URI = nombre del PDF escapado) desde ds:Reference.
- Digest: SHA-256 para datos y propiedades firmadas.
- Canonicalización: Exclusive XML Canonicalization (exc-c14n) en SignedInfo y SignedProperties.
- xades:SignedProperties incluye: SigningTime (UTC) y SigningCertificate (digest SHA-256 + Issuer/Serial decimal).
- xades:SignedDataObjectProperties/xades:DataObjectFormat declara MimeType=application/pdf y Description=nombre del PDF.
- KeyInfo: X509Certificate end-entity (se puede extender a cadena cuando corresponda).
4. Estructura mínima de la firma (direct reference)
- Raíz: .
- ds:Signature/@Id = SIG-…; contiene ds:SignedInfo, ds:SignatureValue, ds:KeyInfo y ds:Object.
- ds:SignedInfo:
- • ds:CanonicalizationMethod/@Algorithm = exc-c14n.
- • ds:SignatureMethod/@Algorithm = rsa-sha256.
- • ds:Reference (al PDF):
- - @Id = REF-…
- - @URI = nombre_del_pdf.pdf (percent-encoding UTF-8 cuando proceda)
- - ds:DigestMethod/@Algorithm = SHA-256
- - ds:DigestValue = Base64(SHA-256(PDF))
- • ds:Reference (a SignedProperties):
- - @Type = http://uri.etsi.org/01903#SignedProperties
- - ds:Transforms/ds:Transform/@Algorithm = exc-c14n
- - ds:DigestMethod/@Algorithm = SHA-256
- - ds:DigestValue = Base64(SHA-256(c14n(SignedProperties)))
- ds:Object: incluye xades:QualifyingProperties (con Target=#SIG-…).
- xades:SignedDataObjectProperties/xades:DataObjectFormat/@ObjectReference = #REF-… (apunta a la referencia del PDF).
5. Contenedor ASiC-E (ZIP)
- mimetype: primer entry y sin compresión (stored). Valor: application/vnd.etsi.asic-e+zip.
- PDF: en la raíz, mismo nombre que el original.
- Firmas: META-INF/signatures0.xml (se admite signatures.xml).
- Opcional recomendado: META-INF/manifest.xml (estilo OpenDocument) con media-types.
- Codificación: UTF‑8 sin BOM para archivos XML.
- Empaquetado: mimetype → PDF → firma(s) → manifest.xml (si aplica).
6. Cofirmas (multi‑firmantes)
- Se agregan múltiples ds:Signature al mismo signatures0.xml.
- Cada cofirma referencia el mismo PDF mediante su propia ds:Reference/@Id (REF-…) y su DOF/ObjectReference.
- El contenedor no se sobrescribe: se versiona (_cofirmado, _cofirmado_2, …).
- UI: si está activa la opción de cofirmas, se abre el ASiC-E y se agrega la nueva ds:Signature.
7. PDF representativo (lectura del ASiC-E)
- Para cada ds:Signature se genera una hoja con:
- • Documento: nombre, tamaño, páginas.
- • Integridad: SHA‑256 del PDF.
- • Firmante: CN, RFC (si está en Subject), serie, emisor (CN), vigencia, SigningTime (UTC).
- • Firma: SignatureValue en tipografía monoespaciada (ancho fijo).
- Se añade un QR offline con UUID, xml_sha256 y content_sha256 (texto plano).
- Se adjunta el .asice como EmbeddedFile dentro del PDF representativo.
8. Validación e interoperabilidad
- Validadores compatibles: DSS (EC), OpenASiC, JSignPdf (para PDF), entre otros.
- Mensajes típicos DSS y mitigaciones:
- • SIGNED_DATA_NOT_FOUND → Verificar ds:Reference/@URI (encoding) y que el PDF esté en la raíz.
- • digest algorithm not identified → Asegurar ds:DigestMethod/@Algorithm = SHA‑256 en TODAS las referencias.
- • Not all files are signed → Es normal si el contenedor incluye solo el PDF firmado (otros adjuntos quedarían sin firmar).
- • NO_CERTIFICATE_CHAIN_FOUND → Si se requieren validaciones de confianza, instalar/servir la cadena (ej. SAT) o usar política adecuada.
9. Seguridad y auditoría
- Uso de claves privadas locales (no se transmiten por red).
- Registro audit.log: cadena Prev/Hash por evento (firmas, cofirmas, representativo).
- Opcional: protección de UI (ocultar password; atajos Ctrl+P para mostrar/ocultar).
10. Extensiones futuras
- XAdES‑T: añadir xades:SignatureTimeStamp (RFC 3161) por firma.
- NOM‑151: constancia de conservación externa y/o referencia dentro de la firma o del representativo.
- CLI de validación para lotes, más casos de prueba y regresión.
11. API pública resumida
- XadesDetachedBuilder.CreateDetachedBes(pdfPath, cert): genera XmlDocument con ds:Signature (direct).
- XadesDetachedBuilder.AppendCosignature(existingXml, cert, pdfName, pdfBytes): agrega cofirma (direct).
- AsicEBuilder.CreateAsice(pdfPath, signaturesXml, outAsicePath): empaqueta ASiC‑E.
- AsicEBuilder.CreateAsiceFromBytes(pdfEntryName, pdfBytes, signaturesXml, outAsicePath).
12. Solución de problemas (checklist)
- mimetype primero y stored (no deflate).
- Firmas en META-INF/signatures0.xml (UTF‑8 sin BOM).
- ds:Reference al PDF con URI escapado (UTF‑8 percent-encoding; evitar espacios sin %20).
- xades:DataObjectFormat/@ObjectReference → #REF-… correcto.
- Canonicalización exc‑c14n consistente en SignedInfo y SignedProperties.
- DigestValue del PDF = SHA‑256 real del archivo del contenedor.
- Cadena de confianza: si se requiere superar ‘NO_CERTIFICATE_CHAIN_FOUND’, agregar anclaje y cadena (p. ej., SAT).
13. Referencias normativas (consulta)
- W3C XML Signature Syntax and Processing 1.1 (xmldsig-core1).
- W3C Exclusive XML Canonicalization (xml-exc-c14n).
- ETSI EN 319 132-1 (XAdES Baseline).
- ETSI EN 319 162-1 (ASiC Baseline).
- IETF RFC 3161 (Time-Stamp Protocol).
- NOM‑151‑SCFI‑2016 (DOF, constancia de conservación).
Enlaces de referencia