Firma electrónica de PDF en C# para eIDAS QES, FNMT-RCM y flujos españoles
La firma electrónica de documentos PDF en C# .NET se sitúa, en el contexto español, sobre el marco común europeo eIDAS (Reglamento UE 910/2014) — que define tres niveles de firma (simple, avanzada y cualificada / QES) y obliga a los Estados miembros a reconocer recíprocamente las firmas emitidas con certificados de Prestadores Cualificados de Servicios de Confianza (QTSP) inscritos en la lista nacional. El ecosistema ibérico de Autoridades de Certificación está dominado por la FNMT-RCM (Fábrica Nacional de Moneda y Timbre — Real Casa de la Moneda), con AC Camerfirma y IZENPE (foral vasca) como alternativas frecuentes. La firma cualificada — exigible en flujos como Crea y Crece B2B, FACe B2G y la cadena XAdES de TicketBAI — requiere además un dispositivo cualificado de creación de firma (QSCD): habitualmente un HSM o tarjeta criptográfica. IronPDF cubre la firma PAdES sobre el PDF visualizable y la integración con HSM vía PKCS#11, dejando la firma XAdES del XML estructurado a las bibliotecas especializadas.
TL;DR: Guía rápida de firma electrónica para flujos españoles
Este tutorial cubre la firma criptográfica de PDFs con C#, anclado en el marco eIDAS y en los flujos españoles de firma electrónica (FACe, Crea y Crece, TicketBAI, VeriFactu, expedientes administrativos bajo ENI).
- A quién va dirigido: Desarrolladores .NET que construyen sistemas que firman PDFs con certificado cualificado en el contexto ibérico — software de facturación bajo VeriFactu, ERPs que envían a FACe, gestores documentales del sector público bajo Esquema Nacional de Interoperabilidad, integradores que firman PDFs para clientes con HSM corporativos.
- Qué construirá: Firma PAdES básica con certificado FNMT-RCM (
.pfx/.p12), firmas avanzadas (AES) y cualificadas (QES) con sello de tiempo de TSA-FNMT, firmas visuales y multi-firma secuencial para flujos de aprobación, verificación contra la lista nacional de QTSPs cualificados, firma con HSM/PKCS#11 para certificados cualificados con clave protegida en hardware. - Dónde se ejecuta: .NET 10, .NET 8 LTS, .NET Framework 4.6.2+ y .NET Standard 2.0. Diseño on-premise alineado con LOPDGDD/AEPD: la firma se realiza dentro del perímetro del integrador, sin enviar el documento ni la clave privada a servicios externos.
- Cuándo aplicar este enfoque: Cuando deba emitir PDFs firmados conformes con eIDAS QES (Crea y Crece, FACe, contratos B2B regulados), cuando deba firmar la visualización de facturas VeriFactu (PAdES sobre el PDF que ve el cliente final), cuando integre HSM corporativo para certificado cualificado del emisor, o cuando construya un flujo multi-firma para expedientes administrativos del sector público español.
- Por qué importa técnicamente: Las firmas criptográficas basadas en certificados X.509 cualificados eIDAS son legalmente equivalentes a la firma manuscrita en toda la UE. En el contexto ibérico, sin embargo, las imágenes de firmas visuales sin respaldo criptográfico no constituyen firma electrónica — son meras representaciones gráficas. La distinción es relevante porque la firma cualificada es exigible en cada vez más flujos (recepción Crea y Crece, expedientes administrativos electrónicos, contratos digitales con consumidores bajo LCGC).
Para seguir los ejemplos, consulte la guía rápida de instalación e instale IronPDF en su proyecto. Firma su primer PDF con pocas líneas de código:
-
Instala IronPDF con el Administrador de Paquetes NuGet
PM > Install-Package IronPdf -
Copie y ejecute este fragmento de código.
var signature = new IronPdf.Signing.PdfSignature("certificado.pfx", "contraseña"); IronPdf.PdfDocument.FromFile("documento.pdf").Sign(signature).SaveAs("firmado.pdf"); -
Despliegue para probar en su entorno real
Comienza a usar IronPDF en tu proyecto hoy mismo con una prueba gratuita
Descargue el proyecto completo
Para comenzar rápidamente, descargue el proyecto de trabajo completo con todos los ejemplos de código de este tutorial.
La descarga incluye un proyecto .NET totalmente configurado con un certificado de muestra y todos los ejemplos listos para compilar y ejecutar.
Una vez adquirida la licencia de IronPDF o iniciada la prueba de 30 días, registre la clave al arrancar el proceso.
IronPdf.License.LicenseKey = "KEY";
IronPdf.License.LicenseKey = "KEY";
Imports IronPdf
IronPdf.License.LicenseKey = "KEY"
Comience a usar IronPDF en su proyecto hoy con una prueba gratuita.
Tabla de contenido
- Marco eIDAS y firma electrónica en España
- Ecosistema español de Autoridades de Certificación
- Firma PAdES sobre PDF en C# con IronPDF
- Sello de tiempo cualificado con TSA-FNMT
- HSM y QSCD para certificados cualificados
- Flujos españoles: FACe, Crea y Crece, TicketBAI
- Firma visual y flujos multi-firma
- Verificación de firmas y detección de manipulación
Marco eIDAS y firma electrónica en España
El Reglamento (UE) 910/2014 — conocido como eIDAS (electronic IDentification, Authentication and trust Services) — es el marco normativo común europeo que regula la firma electrónica, los sellos electrónicos, los sellos de tiempo cualificados y los servicios de confianza. En España se aplica directamente; la Ley 6/2020 reguladora de determinados aspectos de los servicios electrónicos de confianza completa el marco con disposiciones nacionales sobre los prestadores cualificados y el régimen sancionador.
Tres niveles eIDAS: SES, AES y QES
eIDAS reconoce tres niveles de firma electrónica con consecuencias jurídicas distintas:
- Firma electrónica simple (SES) — cualquier conjunto de datos asociado al documento que identifique al firmante (clic en un botón "acepto", una imagen de firma manuscrita, una marca de agua). No garantiza autenticidad criptográfica ni integridad. Suficiente para muchas operaciones B2C de bajo riesgo, pero NO equivale jurídicamente a una firma manuscrita.
- Firma electrónica avanzada (AES) — firma vinculada únicamente al firmante, que permite identificarlo y se crea con datos de creación de firma bajo su control exclusivo. Implementada típicamente con certificado X.509 (PKI) cuya clave privada está bajo custodia del firmante. PAdES-B y PAdES-T cubren este nivel cuando se usa con certificado emitido por una CA reconocida no cualificada.
- Firma electrónica cualificada (QES) — firma avanzada que adicionalmente se crea con un dispositivo cualificado de creación de firma (QSCD: HSM cualificado, tarjeta criptográfica certificada Common Criteria EAL4+) y se basa en un certificado cualificado emitido por un Prestador Cualificado de Servicios de Confianza (QTSP) inscrito en la lista nacional. Es la única firma que eIDAS reconoce automáticamente como equivalente jurídico a la firma manuscrita en toda la UE.
Para la mayoría de los flujos regulados españoles que exigen firma "con valor jurídico equivalente al manuscrito" — Crea y Crece B2B, FACe B2G, contratos del sector público, expedientes administrativos bajo ENI, factura cualificada SII — el nivel exigible es QES. La consecuencia operativa para el desarrollador: el certificado debe ser cualificado (CA inscrita en la lista nacional), la clave privada debe estar protegida en HSM o tarjeta criptográfica cualificada, y el flujo de firma debe acoplar correctamente IronPDF (PAdES sobre el PDF) con el componente de gestión de la clave en hardware.
Lista nacional de QTSPs y validación
La lista de prestadores cualificados de servicios de confianza se mantiene por la Secretaría de Estado de Digitalización y se publica en https://sede.serviciosmin.gob.es/Prestadores/. Cualquier certificado emitido por un QTSP de esta lista (o de la lista análoga de otro Estado miembro de la UE, bajo reconocimiento mutuo eIDAS) es válido para firma cualificada en flujos españoles. La lista incluye:
- FNMT-RCM — emite certificados cualificados de persona física (CPF), de representante de persona jurídica, de empleado público, y certificados de sello electrónico para entidades.
- AC Camerfirma — extensiva en el ámbito notarial, registral y empresarial.
- IZENPE — autoridad de certificación del Gobierno Vasco; cobertura en territorio foral vasco.
- Firma Profesional (Autoridad Pública de Certificación Española) — operada por consejo general de colegios profesionales.
- AC Abogacía — gestionada por el Consejo General de la Abogacía Española, certificados específicos para profesionales del derecho.
- DigiCert, GlobalSign, Sectigo y otros prestadores europeos — admisibles bajo el reconocimiento mutuo eIDAS si están cualificados en algún Estado miembro.
La validación de una firma PAdES recibida debe comprobar tres cosas: que el certificado del firmante encadena a una CA raíz incluida en la EU LOTL (List of Trusted Lists) o en la lista nacional española; que el sello de tiempo (si está presente) proviene también de un TSA cualificado; y que la información de revocación capturada en el momento de firma sigue siendo válida o, en su defecto, que el sello de archivado renovable mantiene intacta la cadena de confianza.
AutoFirma y herramientas oficiales
AutoFirma (administracionelectronica.gob.es/ctt/autofirma) es la aplicación oficial de la Administración General del Estado para firma electrónica desde el escritorio del ciudadano o del empleado público. Soporta CAdES, XAdES y PAdES, y es la referencia operativa más usada en flujos B2G donde el firmante actúa desde su propio puesto de trabajo (no en un servicio backend).
Para flujos backend — el caso que IronPDF cubre — AutoFirma no aplica. El integrador construye el flujo de firma directamente en .NET, accediendo al certificado almacenado en .pfx, en el almacén certificado de Windows, o en un HSM vía PKCS#11. AutoFirma es la herramienta de referencia para el lado humano del flujo; IronPDF es la herramienta de referencia para el lado automatizado.
Ecosistema español de Autoridades de Certificación
España no tiene un único monopolio de certificación cualificada — coexisten varias CAs con perfiles diferentes según el sector. La elección de CA depende del tipo de firmante (persona física, persona jurídica, empleado público, profesional) y del sector de uso (administración general, foral vasco, notarial, profesional).
FNMT-RCM: la CA dominante del sector público
La Fábrica Nacional de Moneda y Timbre — Real Casa de la Moneda (fnmt.es) opera la rama de certificación con mayor adopción en España. Su gama incluye:
- Certificado de Persona Física (CPF) — certificado cualificado del ciudadano, instalable en navegador, tarjeta criptográfica o dispositivo Cl@ve.
- Certificado de Representante de Persona Jurídica — para administradores únicos o solidarios actuando en nombre de la entidad.
- Certificado de Empleado Público — para profesionales de la AGE, CCAA o entes locales actuando en su condición funcional. Habitualmente almacenado en tarjeta cualificada con PIN bajo norma Cl@ve.
- Certificado de Entidad (sello electrónico) — para automatización: emite documentos firmados por la entidad sin intervención de persona física. Es el certificado que un ERP usa para firmar facturas en nombre de la empresa.
- TSA-FNMT — TSA cualificada para sellos de tiempo, accesible en
tsa.fnmt.es.
La FNMT-RCM publica los certificados raíz y CRLs en sede.fnmt.gob.es. La cadena de confianza FNMT está incluida en EU LOTL, las distribuciones de Mozilla, Apple y Microsoft, y en el almacén de certificados raíz por defecto de los principales sistemas operativos.
AC Camerfirma y Firma Profesional para empresa
AC Camerfirma (camerfirma.com) — operada por las Cámaras de Comercio españolas — tiene presencia significativa en el ámbito empresarial, notarial y registral. Emite certificados de representante legal, de apoderado, de pertenencia a empresa y de sello empresarial. Su cuota es relevante en empresas medianas y grandes que no han optado por FNMT-RCM por preferencia sectorial o por integración con cámaras de comercio.
Firma Profesional (firmaprofesional.com) — Autoridad Pública de Certificación operada por consejos generales de colegios profesionales (medicina, abogacía, ingeniería). Sus certificados están dirigidos a profesionales colegiados que firman documentos en su condición funcional. Casos de uso típicos: recetas médicas electrónicas firmadas por médico colegiado, dictámenes periciales firmados por ingeniero colegiado, escritos forenses firmados por abogado colegiado.
IZENPE en territorio foral vasco
IZENPE (izenpe.eus) — autoridad de certificación del Gobierno Vasco — emite certificados cualificados para ciudadanos vascos, empleados públicos de la administración foral, y entidades inscritas en territorio foral vasco. En flujos TicketBAI los certificados IZENPE conviven con los FNMT-RCM, pero IZENPE tiene presencia preferente en empresas y administraciones de Bizkaia, Gipuzkoa, Araba y Navarra (esta última usa también la propia autoridad foral correspondiente).
Para integradores de software que sirven al mercado vasco, conviene contemplar IZENPE como opción de certificado del lado del firmante; IronPDF acepta cualquier certificado X.509 conforme al estándar, con independencia de la CA emisora.
Firma PAdES sobre PDF en C# con IronPDF
PAdES (PDF Advanced Electronic Signatures, ETSI EN 319 142) es el perfil eIDAS de firma electrónica sobre documentos PDF. IronPDF firma PDFs en PAdES con cualquier certificado X.509 conforme — incluidos certificados cualificados FNMT-RCM, Camerfirma, IZENPE, y prestadores europeos reconocidos bajo eIDAS.
Formatos de certificado soportados (.pfx, .p12)
IronPDF trabaja con certificados en formato estándar PKCS#12, normalmente almacenados como archivos .pfx o .p12. Estos archivos agrupan la clave privada (necesaria para firmar) con el certificado público (necesario para verificar) en un único contenedor protegido por contraseña.
En el entorno español hay tres orígenes habituales de certificados:
- Certificados emitidos por QTSP cualificado (FNMT-RCM, Camerfirma, IZENPE, Firma Profesional) — descargados del portal del prestador como
.pfxcon contraseña, o instalados en tarjeta criptográfica. - Certificados PKI internos — emitidos por la CA interna de la organización; útiles para firma interna (informes técnicos, documentos no externalizables) pero NO admisibles para firma cualificada eIDAS si la CA no está inscrita en la lista nacional.
- Certificados autofirmados — útiles únicamente para desarrollo y pruebas; producirán advertencias en cualquier visor PDF.
Para cargar un certificado en IronPDF debe especificarse la opción X509KeyStorageFlags.Exportable, que permite al subsistema criptográfico acceder a la clave privada para firmar:
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-digital-signatures-csharp-guide/load-certificate.cs
using System.Security.Cryptography.X509Certificates;
// Load the certificate from a PKCS#12 file (.pfx or .p12)
// The Exportable flag allows the private key to be used for signing
var certificate = new X509Certificate2(
"company-signing-cert.pfx",
"certificate-password",
X509KeyStorageFlags.Exportable
);
Imports System.Security.Cryptography.X509Certificates
' Load the certificate from a PKCS#12 file (.pfx or .p12)
' The Exportable flag allows the private key to be used for signing
Dim certificate As New X509Certificate2(
"company-signing-cert.pfx",
"certificate-password",
X509KeyStorageFlags.Exportable
)
Salida de ejemplo:
Certificate loaded successfully
Subject: CN=Test Signer, O=Test Organization, C=US
Issuer: CN=Test Signer, O=Test Organization, C=US
Valid From: 2026-01-27 7:50:04 AM
Valid To: 2027-01-27 8:00:03 AM
Thumbprint: 41355DE5ADD66CD64B2B99FF2CF87B9C87BD412F
Has Private Key: True
En producción ibérica, la contraseña del certificado debe extraerse de un almacén seguro — Azure Key Vault, AWS Secrets Manager o HashiCorp Vault son habituales; en entornos sector público bajo ENS conviene usar la solución de gestión de claves homologada de la organización. Nunca incluya contraseñas de certificados en el control de versiones ni en archivos de configuración no cifrados — el régimen sancionador AEPD bajo LOPDGDD trata las claves privadas de firma como datos especialmente sensibles.
Firma PAdES básica con certificado FNMT-RCM
El flujo más simple — cargar un PDF, crear una firma desde un certificado FNMT-RCM, guardar el resultado firmado — se cubre con tres líneas de IronPDF. La biblioteca gestiona todas las operaciones criptográficas internamente:
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-digital-signatures-csharp-guide/basic-signing.cs
using IronPdf;
using IronPdf.Signing;
// Load the PDF document that needs to be signed
PdfDocument pdf = PdfDocument.FromFile("contract.pdf");
// Create a signature object using the certificate file path and password
var signature = new PdfSignature("certificate.pfx", "password");
// Apply the cryptographic signature to the document
// This embeds an invisible digital signature in the PDF structure
pdf.Sign(signature);
// Save the signed document to a new file
pdf.SaveAs("contract-signed.pdf");
Imports IronPdf
Imports IronPdf.Signing
' Load the PDF document that needs to be signed
Dim pdf As PdfDocument = PdfDocument.FromFile("contract.pdf")
' Create a signature object using the certificate file path and password
Dim signature As New PdfSignature("certificate.pfx", "password")
' Apply the cryptographic signature to the document
' This embeds an invisible digital signature in the PDF structure
pdf.Sign(signature)
' Save the signed document to a new file
pdf.SaveAs("contract-signed.pdf")
Entrada
Salida
El resultado es un PDF con firma digital invisible embebida. Cuando se abre en Adobe Acrobat, AutoFirma, FNMT-Ceres o cualquier otro visor PDF compatible con firma, el documento muestra el panel de validación de firma con la información del firmante (extraída del campo Subject del certificado), la fecha y hora de firma, y si el documento ha sido modificado desde la firma.
Para procesamiento por lotes — habitual cuando un ERP genera y firma cientos de facturas al cierre mensual — IronPDF ofrece un patrón one-liner:
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-digital-signatures-csharp-guide/one-line-signing.cs
using IronPdf;
using IronPdf.Signing;
// One-line approach for signing PDFs
// Useful for batch processing where you don't need to manipulate the document
var signature = new PdfSignature("certificate.pfx", "password");
PdfDocument.FromFile("document.pdf").Sign(signature).SaveAs("document-signed.pdf");
Imports IronPdf
Imports IronPdf.Signing
' One-line approach for signing PDFs
' Useful for batch processing where you don't need to manipulate the document
Dim signature As New PdfSignature("certificate.pfx", "password")
PdfDocument.FromFile("document.pdf").Sign(signature).SaveAs("document-signed.pdf")
Metadatos de firma y razón de firma
Las firmas digitales admiten metadatos que dan contexto al evento de firma. Esta información se muestra en el panel de firma de los visores PDF y se incorpora al rastro de auditoría del documento. Los campos relevantes en flujos ibéricos:
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-digital-signatures-csharp-guide/signature-metadata.cs
using IronPdf;
using IronPdf.Signing;
using System;
// Load the document to be signed
PdfDocument pdf = PdfDocument.FromFile("invoice.pdf");
// Create a signature with the company certificate
var signature = new PdfSignature("certificate.pfx", "password")
{
// Add metadata to create an audit trail
// This information appears in the signature panel of PDF readers
SigningReason = "Invoice Approval",
SigningLocation = "New York Office",
SigningContact = "accounts@company.com",
SignatureDate = DateTime.UtcNow
};
// Apply the signature with all metadata included
pdf.Sign(signature);
pdf.SaveAs("invoice-approved.pdf");
Imports IronPdf
Imports IronPdf.Signing
Imports System
' Load the document to be signed
Dim pdf As PdfDocument = PdfDocument.FromFile("invoice.pdf")
' Create a signature with the company certificate
Dim signature As New PdfSignature("certificate.pfx", "password") With {
' Add metadata to create an audit trail
' This information appears in the signature panel of PDF readers
.SigningReason = "Invoice Approval",
.SigningLocation = "New York Office",
.SigningContact = "accounts@company.com",
.SignatureDate = DateTime.UtcNow
}
' Apply the signature with all metadata included
pdf.Sign(signature)
pdf.SaveAs("invoice-approved.pdf")
| Campo de metadatos | Propósito | Valor de ejemplo (contexto ibérico) |
|---|---|---|
SigningReason |
Razón de la firma | "Aprobación de factura conforme con VeriFactu", "Conformidad expediente administrativo" |
SigningLocation |
Lugar de la firma | "Madrid, Oficina Central", "Bilbao, Sucursal Bizkaia" |
SigningContact |
Contacto del firmante para consultas | "contabilidad@empresa.es", "+34 91 555 0123" |
SignatureDate |
Marca temporal del evento de firma | DateTime.UtcNow |
En sistemas ibéricos, estos campos se conectan habitualmente con la información operativa: el sistema de aprobación de facturas establece SigningReason al número del registro VeriFactu correspondiente, la plataforma de gestión documental establece la ubicación al código del puesto de trabajo del empleado público, y el campo de contacto se rellena con el correo electrónico del departamento responsable.
Sello de tiempo cualificado con TSA-FNMT
Las firmas digitales incluyen una marca temporal del momento de la firma, pero esa marca proviene del reloj del servidor donde se firmó. Para firmas que requieran verificación años después, o cuando la fecha exacta de firma tenga relevancia jurídica, un sello de tiempo cualificado emitido por una Time Stamping Authority (TSA) cualificada proporciona evidencia legal independiente.
RFC 3161 y TSAs españolas cualificadas
El protocolo de sello de tiempo es RFC 3161 (Time-Stamp Protocol, TSP). IronPDF soporta cualquier TSA conforme RFC 3161 — incluyendo las TSAs cualificadas españolas y europeas:
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-digital-signatures-csharp-guide/timestamp-server.cs
using IronPdf;
using IronPdf.Signing;
using System;
// Load the document to sign
PdfDocument pdf = PdfDocument.FromFile("agreement.pdf");
var signature = new PdfSignature("certificate.pfx", "password")
{
SigningReason = "Agreement Execution",
// Configure a trusted timestamp server (RFC 3161 compliant)
// This provides cryptographic proof of when the document was signed
TimestampHashAlgorithm = TimestampHashAlgorithms.SHA256,
TimeStampUrl = "http://timestamp.digicert.com"
};
// Apply the signature with the trusted timestamp
pdf.Sign(signature);
pdf.SaveAs("agreement-timestamped.pdf");
Imports IronPdf
Imports IronPdf.Signing
Imports System
' Load the document to sign
Dim pdf As PdfDocument = PdfDocument.FromFile("agreement.pdf")
Dim signature As New PdfSignature("certificate.pfx", "password") With {
.SigningReason = "Agreement Execution",
' Configure a trusted timestamp server (RFC 3161 compliant)
' This provides cryptographic proof of when the document was signed
.TimestampHashAlgorithm = TimestampHashAlgorithms.SHA256,
.TimeStampUrl = "http://timestamp.digicert.com"
}
' Apply the signature with the trusted timestamp
pdf.Sign(signature)
pdf.SaveAs("agreement-timestamped.pdf")
TSAs cualificadas habitualmente usadas en el ecosistema ibérico:
- TSA-FNMT (
tsa.fnmt.es) — TSA cualificada de la FNMT-RCM. La más extendida en sector público y en empresas con certificados FNMT. - AC Camerfirma TSA — TSA disponible para clientes con certificados Camerfirma; muy usada en ámbito notarial y empresarial mediano.
- IZENPE TSA — TSA del País Vasco, usada junto con TicketBAI y certificados IZENPE.
- TSAs europeas reconocidas eIDAS — DigiCert TSA, GlobalSign TSA y otras admisibles bajo reconocimiento mutuo si están cualificadas en algún Estado miembro de la UE.
La elección del algoritmo de hash importa para la validez extendida. SHA-256 es el estándar actual; IronPDF también soporta SHA-512 para requisitos de seguridad más estrictos. Los algoritmos antiguos como SHA-1 deben evitarse — están obsoletos criptográficamente y no son admisibles para firma cualificada.
Niveles PAdES-B, PAdES-T, PAdES-LT, PAdES-LTV
PAdES (ETSI EN 319 142) define cuatro niveles de conformidad de complejidad creciente:
- PAdES-B (basic) — firma electrónica con certificado X.509. Aporta autenticidad e integridad. Es el nivel mínimo de eIDAS AES cuando el certificado es cualificado.
- PAdES-T (timestamp) — PAdES-B más sello de tiempo cualificado al momento de la firma. Demuestra cuándo se firmó.
- PAdES-LT (long-term) — PAdES-T más información de revocación (OCSP, CRLs) embebida en un Document Security Store. Permite validar la firma sin acceso a las fuentes originales de OCSP/CRL.
- PAdES-LTV (long-term validation) — PAdES-LT más sello de tiempo de archivado renovable. Permite re-sellado periódico para extender indefinidamente la cadena de confianza, incluso después de que el algoritmo de hash de la firma original quede obsoleto.
Para flujos del sector público español bajo ENI con plazos de conservación extendidos, PAdES-LTV es la elección operativa. Para flujos B2B Crea y Crece donde la factura debe sobrevivir al periodo de prescripción tributaria (4-10 años bajo LGT), PAdES-LT con re-sellado opcional suele ser suficiente. Para flujos de contrato comercial estándar PAdES-T basta.
HSM y QSCD para certificados cualificados
La firma electrónica cualificada eIDAS requiere un dispositivo cualificado de creación de firma (QSCD) — habitualmente un HSM (Hardware Security Module) certificado Common Criteria EAL4+ o una tarjeta criptográfica cualificada. La clave privada del certificado vive dentro del dispositivo y nunca sale en claro; el HSM expone una interfaz Sign(hash) que genera la firma sin revelar la clave.
Integración PKCS#11 con HSM corporativo
PKCS#11 (Cryptographic Token Interface Standard, también conocido como Cryptoki) es el estándar industrial para acceder a HSMs desde aplicaciones. IronPDF soporta integración PKCS#11 a través de su funcionalidad HsmSigner, permitiendo firmar PDFs con claves protegidas en HSM corporativo sin que la clave privada toque la memoria del proceso .NET.
HSMs cualificados habituales en el mercado español:
- HSMs en nube cualificados eIDAS — AWS CloudHSM, Azure Dedicated HSM, Google Cloud HSM con configuración FIPS 140-2 Level 3. Requieren validación adicional para uso como QSCD.
- HSMs on-premise — Thales Luna, Entrust nShield, Utimaco SecurityServer — ampliamente desplegados en banca, seguros, sector público y en proveedores cualificados.
- HSMs en nube de prestador cualificado — FNMT-RCM ofrece servicio de firma centralizada para entidades públicas y privadas usando HSM cualificado gestionado por el propio prestador.
El patrón habitual de integración: la aplicación .NET con IronPDF carga el certificado público desde el HSM (sólo metadatos, no clave privada), construye el hash del PDF a firmar localmente, envía el hash al HSM vía PKCS#11, y recibe el bloque de firma criptográfica que IronPDF embebe en el PDF de salida con el formato PAdES apropiado.
Tarjetas criptográficas y Cl@ve PIN
Para flujos donde el firmante es persona física actuando desde un puesto de trabajo (no en backend automatizado), la firma cualificada habitualmente se realiza con tarjeta criptográfica — DNIe (Documento Nacional de Identidad electrónico) o tarjeta corporativa cualificada. El usuario inserta la tarjeta en el lector, introduce el PIN, y la operación de firma se realiza dentro del chip de la tarjeta.
Para este caso, IronPDF puede invocarse desde una aplicación cliente que accede al certificado almacenado en la tarjeta a través del almacén de Windows (CryptoAPI / CNG) o de PKCS#11 directo. AutoFirma cubre el patrón de aplicación cliente; un sistema custom puede integrar IronPDF con la misma infraestructura subyacente.
Cl@ve PIN y Cl@ve Permanente son los sistemas de autenticación del ciudadano de la Administración General del Estado, con soporte para firma cualificada en flujos guiados desde sede electrónica. Para integración programática backend Cl@ve no aplica — es un sistema de orquestación del usuario humano.
Flujos españoles: FACe, Crea y Crece, TicketBAI
Tres flujos concentran la mayor parte del trabajo real de firma cualificada en el ecosistema ibérico.
Firma PAdES en envíos B2G a FACe
FACe (face.gob.es) — el Punto General de Entrada de Facturas Electrónicas de la Administración General del Estado — recibe facturas en formato Facturae XML firmadas con XAdES. Sin embargo, el PDF visualizable que se entrega al receptor habitualmente se firma también con PAdES como capa adicional de no repudio.
El patrón típico para un proveedor que factura a un organismo público:
- El ERP del proveedor genera el XML Facturae 3.2.2.
- El sistema firma el XML con XAdES usando el certificado cualificado del representante de la entidad emisora (FNMT-RCM de representante legal, típicamente).
- IronPDF renderiza el PDF visualizable de la factura desde la plantilla HTML correspondiente.
- IronPDF firma el PDF visualizable con PAdES usando el mismo certificado cualificado.
- El conjunto — PDF/A-3 con Facturae XML embebido y firmado, sobre el cual además vive una firma PAdES — se sube a FACe vía interfaz web o API SOAP/REST.
El esfuerzo de firma se duplica (XAdES sobre XML + PAdES sobre PDF), pero la finalidad jurídica también: el XML es la fuente estructurada que el ERP del receptor procesa automáticamente; el PDF es la copia visualizable que circula por correo electrónico, archivado, o reproducción impresa. Ambas firmas pueden compartir el mismo certificado cualificado del emisor.
Crea y Crece B2B: PAdES + Facturae XAdES
Bajo el mandato Crea y Crece (2027 para empresas > 8 M €, 2028 para el resto), el flujo es estructuralmente idéntico al de FACe — emisión de Facturae XML firmado con XAdES, PDF visualizable firmado con PAdES, intercambio vía plataforma autorizada (EDICOM, Sovos, Seres, Voxel) o canal directo. La diferencia es el destinatario: FACe es la pasarela B2G del sector público, Crea y Crece es el régimen B2B privado entre empresas.
Para el flujo B2B Crea y Crece, el patrón híbrido PDF/A-3 con Facturae XML embebido como anexo (cubierto en detalle en el tutorial de archivado PDF/A) simplifica la lógica: un único archivo lleva el documento visualizable, el XML estructurado, ambas firmas y los metadatos XMP. IronPDF genera el PDF/A-3 desde HTML, embebe el XML Facturae como anexo, y aplica la firma PAdES sobre el contenedor.
TicketBAI y la cadena XAdES foral
TicketBAI — vigente en Bizkaia, Gipuzkoa y Araba — opera sobre una cadena de tickets XML firmados con XAdES y encadenados por hash al ticket anterior. La firma XAdES sobre el XML TicketBAI propiamente dicha queda fuera del alcance directo de IronPDF: IronPDF firma PDFs (PAdES), no XML (XAdES).
Sin embargo, el flujo TicketBAI completo incluye un PDF visualizable del ticket — la boleta que recibe el cliente final, equivalente al ticket de caja del régimen tradicional pero ahora generada electrónicamente. Ese PDF visualizable entra dentro del alcance de IronPDF: se renderiza desde HTML, opcionalmente se firma con PAdES como capa adicional de no repudio, e incluye el QR TicketBAI obligatorio que enlaza al verificador de la Diputación Foral correspondiente.
El certificado de firma habitual en flujos TicketBAI es FNMT-RCM o IZENPE — la elección depende de si el sujeto pasivo opera mayoritariamente fuera del territorio foral vasco (FNMT-RCM) o dentro de él (IZENPE).
Firma visual y flujos multi-firma
Muchos procesos de negocio español tienen costumbre de bloques de firma visibles, y los receptores esperan ver dónde y cuándo se firmó un documento. IronPDF permite aplicar la firma PAdES criptográfica junto con la representación visual sobre la página, obteniendo lo mejor de ambos mundos.
Representación visual sobre PAdES
Una firma visual es típicamente una imagen — firma manuscrita escaneada, sello corporativo, o bloque de texto estilizado — colocada en una posición específica de la página PDF. IronPDF gestiona el posicionamiento y renderizado con el método LoadSignatureImageFromFile:
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-digital-signatures-csharp-guide/visual-signature.cs
using IronPdf;
using IronPdf.Signing;
using IronSoftware.Drawing;
// Load the document to sign
PdfDocument pdf = PdfDocument.FromFile("contract.pdf");
var signature = new PdfSignature("certificate.pfx", "password")
{
SigningReason = "Contract Approval",
SigningLocation = "Head Office"
};
// Define the position and size for the visible signature image
// Rectangle parameters: x position, y position, width, height (in points)
// Points are measured from the bottom-left corner of the page
var signatureArea = new Rectangle(150, 100, 200, 50);
// Load and attach the visual signature image
// The image will appear at the specified location on the document
signature.LoadSignatureImageFromFile(
"signature-image.png", // Path to the signature image file
0, // Page index (0 = first page)
signatureArea // Position and dimensions
);
// Apply both the cryptographic signature and visual representation
pdf.Sign(signature);
pdf.SaveAs("contract-visually-signed.pdf");
Imports IronPdf
Imports IronPdf.Signing
Imports IronSoftware.Drawing
' Load the document to sign
Dim pdf As PdfDocument = PdfDocument.FromFile("contract.pdf")
Dim signature As New PdfSignature("certificate.pfx", "password") With {
.SigningReason = "Contract Approval",
.SigningLocation = "Head Office"
}
' Define the position and size for the visible signature image
' Rectangle parameters: x position, y position, width, height (in points)
' Points are measured from the bottom-left corner of the page
Dim signatureArea As New Rectangle(150, 100, 200, 50)
' Load and attach the visual signature image
' The image will appear at the specified location on the document
signature.LoadSignatureImageFromFile(
"signature-image.png", ' Path to the signature image file
0, ' Page index (0 = first page)
signatureArea ' Position and dimensions
)
' Apply both the cryptographic signature and visual representation
pdf.Sign(signature)
pdf.SaveAs("contract-visually-signed.pdf")
El sistema de coordenadas usa puntos (1/72 de pulgada) medidos desde la esquina inferior izquierda de la página. Para una página A4 ibérica estándar (595 x 842 puntos), colocar una firma cerca de la esquina inferior derecha implica considerar tanto el tamaño de la firma como los márgenes apropiados.
Métodos alternativos para cargar imágenes de firma desde diferentes orígenes:
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-digital-signatures-csharp-guide/load-signature-image.cs
using IronPdf.Signing;
using IronSoftware.Drawing;
using System.IO;
// Create signature object
var signature = new PdfSignature("certificate.pfx", "password");
var signatureArea = new Rectangle(400, 50, 150, 75);
// Method 1: Load signature image directly from a file path
signature.LoadSignatureImageFromFile("signature.png", 0, signatureArea);
// Method 2: Load from a stream (useful for database-stored images)
using (FileStream imageStream = File.OpenRead("signature.png"))
{
signature.LoadSignatureImageFromStream(imageStream, 0, signatureArea);
}
// Method 3: Load from AnyBitmap (IronSoftware's cross-platform image type)
AnyBitmap signatureBitmap = AnyBitmap.FromFile("signature.png");
using (var stream = signatureBitmap.ToStream())
{
signature.LoadSignatureImageFromStream(stream, 0, signatureArea);
}
Imports IronPdf.Signing
Imports IronSoftware.Drawing
Imports System.IO
' Create signature object
Dim signature As New PdfSignature("certificate.pfx", "password")
Dim signatureArea As New Rectangle(400, 50, 150, 75)
' Method 1: Load signature image directly from a file path
signature.LoadSignatureImageFromFile("signature.png", 0, signatureArea)
' Method 2: Load from a stream (useful for database-stored images)
Using imageStream As FileStream = File.OpenRead("signature.png")
signature.LoadSignatureImageFromStream(imageStream, 0, signatureArea)
End Using
' Method 3: Load from AnyBitmap (IronSoftware's cross-platform image type)
Dim signatureBitmap As AnyBitmap = AnyBitmap.FromFile("signature.png")
Using stream As Stream = signatureBitmap.ToStream()
signature.LoadSignatureImageFromStream(stream, 0, signatureArea)
End Using
Formatos de imagen soportados: PNG, JPEG, GIF, BMP, TIFF y WebP. PNG con transparencia funciona especialmente bien para imágenes de firma — el fondo transparente permite que el contenido subyacente del documento se vea a través.
Firma secuencial y guardado incremental
Los procesos de negocio español complejos requieren a menudo varias firmas de personas diferentes, aplicadas en orden específico. Un expediente administrativo puede requerir aprobación del técnico instructor, después del jefe de servicio, después del órgano superior firmante. Una factura puede requerir la firma del responsable de compras y del director financiero. IronPDF soporta estos flujos mediante guardado incremental y permisos de firma.
Los documentos PDF pueden almacenar múltiples revisiones internamente, similar al control de versiones. Cada firma aplica al estado del documento en ese momento. Los firmantes posteriores añaden sus firmas a nuevas revisiones, creando una cadena de aprobaciones donde cada firma puede verificarse independientemente.
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-digital-signatures-csharp-guide/sequential-signing-first.cs
using IronPdf;
using IronPdf.Signing;
// Load the purchase order document
PdfDocument pdf = PdfDocument.FromFile("purchase-order.pdf");
// First signer: Department Manager approves the purchase order
var managerSignature = new PdfSignature("certificate.pfx", "password")
{
SigningReason = "Manager Approval",
SigningLocation = "Department A"
};
// Sign the document and save
// This preserves the original state while adding the signature
pdf.Sign(managerSignature);
pdf.SaveAs("po-manager-approved.pdf");
Imports IronPdf
Imports IronPdf.Signing
' Load the purchase order document
Dim pdf As PdfDocument = PdfDocument.FromFile("purchase-order.pdf")
' First signer: Department Manager approves the purchase order
Dim managerSignature As New PdfSignature("certificate.pfx", "password") With {
.SigningReason = "Manager Approval",
.SigningLocation = "Department A"
}
' Sign the document and save
' This preserves the original state while adding the signature
pdf.Sign(managerSignature)
pdf.SaveAs("po-manager-approved.pdf")
Cuando el documento pasa al siguiente firmante, éste lo carga y añade su propia firma:
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-digital-signatures-csharp-guide/sequential-signing-second.cs
using IronPdf;
using IronPdf.Signing;
// Load the document that already has the manager's signature
PdfDocument pdf = PdfDocument.FromFile("po-manager-approved.pdf");
// Second signer: Finance department verifies budget availability
var financeSignature = new PdfSignature("certificate.pfx", "password")
{
SigningReason = "Finance Approval",
SigningLocation = "Finance Department"
};
// Add the second signature
// Both signatures remain independently verifiable
pdf.Sign(financeSignature);
pdf.SaveAs("po-finance-approved.pdf");
Imports IronPdf
Imports IronPdf.Signing
' Load the document that already has the manager's signature
Dim pdf As PdfDocument = PdfDocument.FromFile("po-manager-approved.pdf")
' Second signer: Finance department verifies budget availability
Dim financeSignature As New PdfSignature("certificate.pfx", "password") With {
.SigningReason = "Finance Approval",
.SigningLocation = "Finance Department"
}
' Add the second signature
' Both signatures remain independently verifiable
pdf.Sign(financeSignature)
pdf.SaveAs("po-finance-approved.pdf")
Cada revisión mantiene su propia firma, y los visores PDF muestran el historial completo de quién firmó cuándo. En expedientes administrativos bajo ENI, este historial sirve como evidencia legal del orden de aprobación.
Verificación de firmas y detección de manipulación
Antes de añadir una nueva firma a un documento, el código debe verificar que las firmas existentes siguen siendo válidas. Un documento modificado fuera del flujo previsto puede tener firmas inválidas — síntoma de manipulación o de violación de proceso.
Validar firmas existentes antes de añadir nuevas
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-digital-signatures-csharp-guide/verify-signatures.cs
using IronPdf;
using System;
// Load a signed document
PdfDocument pdf = PdfDocument.FromFile("contract-signed.pdf");
// Verify all existing signatures in the document
// Returns true only if ALL signatures are valid and untampered
bool isValid = pdf.VerifyPdfSignatures();
Console.WriteLine($"Signatures Valid: {isValid}");
// Get signature details
var signatures = pdf.GetVerifiedSignatures();
Console.WriteLine($"Number of Signatures: {signatures.Count}");
Imports IronPdf
Imports System
' Load a signed document
Dim pdf As PdfDocument = PdfDocument.FromFile("contract-signed.pdf")
' Verify all existing signatures in the document
' Returns true only if ALL signatures are valid and untampered
Dim isValid As Boolean = pdf.VerifyPdfSignatures()
Console.WriteLine($"Signatures Valid: {isValid}")
' Get signature details
Dim signatures = pdf.GetVerifiedSignatures()
Console.WriteLine($"Number of Signatures: {signatures.Count}")
Para inspección detallada, se puede recuperar información de cada firma verificada:
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-digital-signatures-csharp-guide/get-verified-signatures.cs
using IronPdf;
using System;
// Load a document with multiple signatures
PdfDocument pdf = PdfDocument.FromFile("multi-signed-document.pdf");
// Retrieve detailed information about each verified signature
var verifiedSignatures = pdf.GetVerifiedSignatures();
// Iterate through all signatures to build an audit trail
foreach (var sig in verifiedSignatures)
{
Console.WriteLine($"Signer: {sig.SignerName}");
Console.WriteLine($"Reason: {sig.SigningReason}");
Console.WriteLine($"Location: {sig.SigningLocation}");
Console.WriteLine($"Date: {sig.SigningDate}");
Console.WriteLine($"Contact: {sig.SigningContact}");
Console.WriteLine("---");
}
Imports IronPdf
Imports System
' Load a document with multiple signatures
Dim pdf As PdfDocument = PdfDocument.FromFile("multi-signed-document.pdf")
' Retrieve detailed information about each verified signature
Dim verifiedSignatures = pdf.GetVerifiedSignatures()
' Iterate through all signatures to build an audit trail
For Each sig In verifiedSignatures
Console.WriteLine($"Signer: {sig.SignerName}")
Console.WriteLine($"Reason: {sig.SigningReason}")
Console.WriteLine($"Location: {sig.SigningLocation}")
Console.WriteLine($"Date: {sig.SigningDate}")
Console.WriteLine($"Contact: {sig.SigningContact}")
Console.WriteLine("---")
Next
Esta información permite construir rastros de auditoría, verificar cadenas de aprobación, y asegurar que los documentos tienen todas las firmas requeridas antes de pasar a la siguiente fase del flujo. En el contexto del sector público español bajo ENI, esta verificación es habitualmente obligatoria antes de archivar el documento firmado.
Detección de documentos manipulados
El método VerifyPdfSignatures() devuelve false si cualquier firma del documento es inválida. Las causas habituales: contenido modificado tras la firma, datos de firma corruptos, certificado revocado, o certificado no válido en el momento de uso.
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-digital-signatures-csharp-guide/detect-tampering.cs
using IronPdf;
using System;
// Load a signed document and verify
PdfDocument pdf = PdfDocument.FromFile("contract-signed.pdf");
// Check if all signatures are still valid
bool isValid = pdf.VerifyPdfSignatures();
if (isValid)
{
Console.WriteLine("Document has not been tampered with");
Console.WriteLine("All signatures are valid");
}
else
{
Console.WriteLine("WARNING: Document may have been tampered with!");
Console.WriteLine("One or more signatures are invalid");
}
Imports IronPdf
Imports System
' Load a signed document and verify
Dim pdf As PdfDocument = PdfDocument.FromFile("contract-signed.pdf")
' Check if all signatures are still valid
Dim isValid As Boolean = pdf.VerifyPdfSignatures()
If isValid Then
Console.WriteLine("Document has not been tampered with")
Console.WriteLine("All signatures are valid")
Else
Console.WriteLine("WARNING: Document may have been tampered with!")
Console.WriteLine("One or more signatures are invalid")
End If
En flujos de recepción Crea y Crece, esta verificación se realiza al recibir cada factura entrante: si la firma del emisor sobre el Facturae XML (o sobre el PDF visualizable) es inválida, la factura se rechaza automáticamente y se eleva al departamento de cuentas a pagar para conciliación manual con el proveedor.
Para aplicaciones que requieran eliminación de firmas (por ejemplo, para crear una copia sin firmar para redistribución), IronPDF expone el método RemoveSignatures():
:path=/static-assets/pdf/content-code-examples/tutorials/pdf-digital-signatures-csharp-guide/remove-signatures.cs
using IronPdf;
// Load a signed document
PdfDocument pdf = PdfDocument.FromFile("signed-template.pdf");
// Remove all digital signatures from the document
// This strips signature data but does not restore previous document state
pdf.RemoveSignatures();
// Save as an unsigned version
pdf.SaveAs("unsigned-template.pdf");
Imports IronPdf
' Load a signed document
Dim pdf As PdfDocument = PdfDocument.FromFile("signed-template.pdf")
' Remove all digital signatures from the document
' This strips signature data but does not restore previous document state
pdf.RemoveSignatures()
' Save as an unsigned version
pdf.SaveAs("unsigned-template.pdf")
Nota: la eliminación de firmas no recupera ningún estado previo del documento. El método simplemente elimina los datos de firma de la versión actual.
Próximos pasos
La firma electrónica en C# para el ecosistema documental español es la pieza donde el marco común europeo eIDAS se encuentra con las realidades concretas del mercado ibérico — el dominio de FNMT-RCM en el sector público, la presencia de Camerfirma en el ámbito notarial-empresarial, la singularidad de IZENPE en territorio foral vasco, los HSMs cualificados como QSCD para firma de entidad, las TSAs cualificadas para sello de tiempo, y los tres flujos B2G/B2B/foral (FACe, Crea y Crece, TicketBAI) que concentran la mayor parte del trabajo real. IronPDF cubre la capa PAdES sobre el PDF visualizable, la integración con HSM vía PKCS#11, y la verificación de firmas; las piezas complementarias de XAdES sobre XML, gestión avanzada del certificado en HSM, y orquestación del flujo de aprobación se delegan en componentes especializados que se integran sobre el documento que IronPDF produce.
Para profundizar en aspectos específicos del flujo: el tutorial Archivado electrónico de facturas y documentos en C# con PDF/A para España cubre PAdES-LTV en detalle como capa de archivado a largo plazo; el tutorial Generación de facturas en C# .NET para VeriFactu, TicketBAI y Facturae cubre el flujo de facturación donde la firma PAdES se aplica sobre el PDF visualizable. La guía how-to firma de PDF cubre opciones de firma básica; la guía how-to firma con HSM extiende los patrones a dispositivos PKCS#11 cualificados.
IronPDF es la base sobre la que se monta la firma electrónica PDF en el ecosistema ibérico: firma PAdES-B/T/LT/LTV con certificado X.509 cualificado (FNMT-RCM, AC Camerfirma, IZENPE), integración PKCS#11 con HSM corporativo o de prestador cualificado, sello de tiempo cualificado vía RFC 3161 contra TSA-FNMT u otra TSA reconocida eIDAS, firmas visuales sobre la firma criptográfica, verificación de firmas con detección de manipulación, y operación on-premise dentro del perímetro de la organización — alineada con la preferencia ibérica por arquitecturas que minimicen exposición LOPDGDD bajo el régimen sancionador AEPD.
¿Listo para empezar? Descargue IronPDF y pruébelo con una versión de prueba gratuita de 30 días. La biblioteca incluye una licencia de desarrollo gratuita que permite evaluar la firma PAdES con certificado cualificado FNMT-RCM, la integración con HSM de prueba vía PKCS#11, y la verificación contra la lista de QTSPs cualificados antes de comprometerse con una licencia de producción. Si tiene dudas sobre la integración con su HSM corporativo, sobre la elección de TSA cualificada para su flujo, o sobre el cumplimiento simultáneo de eIDAS QES y los marcos sectoriales españoles, contacte con nuestro equipo de soporte técnico.
Preguntas Frecuentes
¿Qué diferencia hay entre los tres niveles de firma eIDAS (SES, AES, QES)?
SES (firma electrónica simple) es cualquier dato asociado al documento que identifique al firmante — clic en "acepto", imagen de firma escaneada — sin garantía criptográfica. AES (firma electrónica avanzada) está vinculada únicamente al firmante con datos de creación bajo su control exclusivo, típicamente implementada con certificado X.509 PKI. QES (firma electrónica cualificada) es AES más dispositivo cualificado de creación de firma (QSCD: HSM cualificado o tarjeta criptográfica Common Criteria EAL4+) más certificado cualificado emitido por QTSP inscrito en la lista nacional. Sólo QES es automáticamente equivalente a firma manuscrita en toda la UE. Crea y Crece, FACe y los expedientes administrativos del sector público exigen QES.
¿Qué Autoridades de Certificación cualificadas existen en España?
Las principales son: FNMT-RCM (Fábrica Nacional de Moneda y Timbre — Real Casa de la Moneda), dominante en sector público con su gama completa de certificados (Persona Física, Representante de Persona Jurídica, Empleado Público, Sello Electrónico de Entidad); AC Camerfirma, operada por las Cámaras de Comercio españolas y muy presente en ámbito notarial y empresarial; IZENPE, autoridad de certificación del Gobierno Vasco para territorio foral; Firma Profesional, gestionada por consejos generales de colegios profesionales (medicina, abogacía, ingeniería); AC Abogacía del Consejo General de la Abogacía Española; y prestadores europeos como DigiCert, GlobalSign o Sectigo admisibles bajo reconocimiento mutuo eIDAS. La lista oficial se publica en https://sede.serviciosmin.gob.es/Prestadores/.
¿Qué es PAdES-LTV y cuándo se debe usar?
PAdES-LTV (Long-Term Validation) es el nivel superior de la jerarquía PAdES — añade a PAdES-LT un sello de tiempo de archivado renovable que permite re-sellar periódicamente la firma con nuevos timestamps cualificados, extendiendo indefinidamente la cadena de confianza incluso después de que el algoritmo de hash de la firma original quede obsoleto. Es la elección operativa para archivado bajo plazos LGT/LSC (6 años o más), bajo Esquema Nacional de Interoperabilidad (plazos indefinidos para sector público), y para contratos B2B con horizonte temporal superior a 10 años. PAdES-B es insuficiente para esos horizontes; PAdES-T añade timestamp pero no garantiza validabilidad cuando el certificado expira; PAdES-LT embebe información de revocación pero no resuelve la obsolescencia criptográfica del hash.
¿Cómo se integra IronPDF con un HSM cualificado vía PKCS#11?
IronPDF expone el componente HsmSigner para firma con clave protegida en HSM. El patrón típico: la aplicación .NET carga el certificado público desde el HSM (sólo metadatos, sin clave privada), IronPDF construye el hash del PDF a firmar localmente, envía el hash al HSM vía interfaz PKCS#11, y recibe el bloque de firma criptográfica que IronPDF embebe en el PDF de salida con formato PAdES. La clave privada nunca sale del HSM en claro. HSMs cualificados habituales en el mercado español: Thales Luna, Entrust nShield, Utimaco SecurityServer (on-premise), o servicios cloud cualificados como AWS CloudHSM, Azure Dedicated HSM. La FNMT-RCM también ofrece servicio de firma centralizada para entidades públicas usando HSM cualificado gestionado por el propio prestador.
¿Es válida la firma PAdES sobre el PDF visualizable de una factura Facturae?
Sí, y es el patrón habitual en flujos B2G a FACe y B2B bajo Crea y Crece. El XML Facturae se firma con XAdES por el certificado cualificado del emisor — la firma legalmente vinculante. El PDF visualizable de la factura (la representación humana que ve el receptor) se firma adicionalmente con PAdES como capa de no repudio paralela, normalmente con el mismo certificado. El patrón híbrido PDF/A-3 con Facturae XML embebido como anexo lleva ambas firmas conviven en el mismo contenedor: XAdES sobre el XML estructurado interno, PAdES sobre el documento visual completo. IronPDF cubre la firma PAdES; XAdES requiere biblioteca XML de firma especializada.
¿Por qué AutoFirma no aplica a flujos backend con IronPDF?
AutoFirma (administracionelectronica.gob.es/ctt/autofirma) es la aplicación oficial de la AGE para firma electrónica desde el escritorio del ciudadano o empleado público. Soporta CAdES, XAdES y PAdES, y es la referencia operativa más usada en flujos B2G donde el firmante actúa desde su puesto de trabajo personal. Para flujos backend automatizado — el caso que IronPDF cubre — AutoFirma no aplica porque el firmante no es una persona humana interactiva sino una entidad (ERP, gestor documental, sistema de facturación) actuando con certificado de Sello Electrónico de Entidad. IronPDF construye el flujo de firma directamente en .NET, accediendo al certificado almacenado en .pfx, en el almacén de Windows o en HSM corporativo vía PKCS#11. AutoFirma cubre el lado humano del flujo; IronPDF cubre el lado automatizado.
¿Qué TSA cualificada se debe usar para sello de tiempo en flujos ibéricos?
Las TSAs cualificadas habituales en el ecosistema ibérico son: TSA-FNMT (tsa.fnmt.es) operada por la FNMT-RCM, la más extendida en sector público y en empresas con certificados FNMT instalados; TSA de AC Camerfirma disponible para clientes con certificados Camerfirma y muy usada en ámbito notarial; TSA de IZENPE para territorio foral vasco junto con certificados IZENPE y flujos TicketBAI; y TSAs europeas como DigiCert TSA o GlobalSign TSA admisibles bajo reconocimiento mutuo eIDAS si están cualificadas en algún Estado miembro de la UE. El algoritmo de hash recomendado es SHA-256 (estándar actual); SHA-512 es admisible para requisitos más estrictos; SHA-1 está obsoleto criptográficamente y no se admite para firma cualificada.
¿Cómo se valida una firma PAdES contra la lista nacional de QTSPs cualificados?
Hay tres comprobaciones: (1) el certificado del firmante debe encadenar a una CA raíz incluida en la EU LOTL (List of Trusted Lists) o en la lista nacional española publicada en sede.serviciosmin.gob.es/Prestadores/; (2) el sello de tiempo (si está presente) debe provenir también de un TSA cualificado de la misma lista; (3) la información de revocación capturada en el momento de firma (OCSP, CRLs embebidas en el Document Security Store del PDF) debe seguir siendo válida, o el sello de archivado renovable debe mantener intacta la cadena de confianza. IronPDF cubre la verificación criptográfica con VerifyPdfSignatures(); la validación contra la lista de QTSPs cualificados requiere componente adicional que descargue y procese la EU LOTL — útil delegar en bibliotecas especializadas (DSS de Apache Santuario, BouncyCastle con extensiones eIDAS) o servicios externos de validación.
¿Las firmas visuales sin respaldo criptográfico son firma electrónica en España?
No. Una imagen de firma manuscrita escaneada y colocada sobre el PDF, sin firma electrónica criptográfica subyacente, es meramente una representación gráfica — no constituye firma electrónica en sentido jurídico eIDAS. No aporta autenticidad criptográfica, no garantiza integridad, no permite detección de manipulación. Para flujos donde la firma del PDF debe ser legalmente vinculante en España, es necesaria firma PAdES con certificado X.509 (mínimo nivel AES eIDAS, idealmente QES con certificado cualificado y QSCD). La firma visual puede coexistir con la firma PAdES como capa decorativa — IronPDF combina ambas — pero la legalidad la aporta la firma criptográfica subyacente, no la imagen sobreimpuesta.
¿Cómo afecta LOPDGDD al almacenamiento de claves privadas de firma?
La clave privada de un certificado cualificado eIDAS es un dato especialmente sensible bajo LOPDGDD/AEPD — su compromiso permite suplantar al titular del certificado en cualquier firma electrónica. El régimen sancionador AEPD trata las brechas de seguridad de claves privadas como infracciones muy graves. Las medidas operativas obligatorias en flujos ibéricos: nunca incluir contraseñas de certificados en el control de versiones ni en archivos de configuración no cifrados; almacenar claves privadas de entidad en HSM cualificado o servicio gestionado de prestador cualificado; rotar contraseñas periódicamente; restringir acceso al certificado al mínimo conjunto de identidades operativas; registrar cada uso del certificado en log de auditoría; y mantener evidencia documental de las medidas técnicas y organizativas adoptadas para responder ante auditorías AEPD.


