Firma HSM para TicketBAI, eIDAS y Crea y Crece: PAdES y XAdES con IronPDF en C
IronPDF permite la firma segura de PDF mediante Módulos de Seguridad de Hardware (HSM) a través de la API PKCS#11, donde las claves privadas nunca salen del dispositivo físico. En España, la firma con HSM es el mecanismo de referencia para tres casos de uso normativos críticos:
- TicketBAI en el País Vasco: las empresas en Bizkaia, Gipuzkoa y Araba que generan facturas de alto volumen usan HSMs con certificados FNMT o IZENPE (la autoridad de certificación del País Vasco) para firmar registros XAdES de forma masiva, cumpliendo las especificaciones forales sin exponer las claves privadas.
- Firma cualificada eIDAS (QES): para documentos que requieren valor probatorio legal bajo eIDAS, la firma mediante HSM con un certificado cualificado emitido por la FNMT proporciona el nivel más alto de firma electrónica reconocida en toda la Unión Europea.
- Crea y Crece y facturas B2B: la ley Crea y Crece exige firmas PAdES en facturas Facturae para el intercambio B2B. Los ISVs que generan decenas de miles de facturas por hora utilizan HSMs para gestionar las claves de firma sin riesgo de exposición.
Inicio rápido: Firmar un PDF con HSM en C#
- Instala IronPDF a través de NuGet:
Install-Package IronPdf - Configure su dispositivo HSM (o utilice SoftHSM para realizar pruebas)
- Crea un
UsbPkcs11HsmSignercon tus credenciales HSM:-
Instala IronPDF con el Administrador de Paquetes NuGet
-
Copie y ejecute este fragmento de código.
var hsmSigner = new UsbPkcs11HsmSigner(libraryPath, pin, tokenLabel, keyLabel); -
Despliegue para probar en su entorno real
Comienza a usar IronPDF en tu proyecto hoy mismo con una prueba gratuita
-
- Genere su PDF y fírmelo:
var pdf = renderer.RenderHtmlAsPdf("<h1>Document</h1>"); pdf.SignAndSave("signed.pdf", hsmSigner);var pdf = renderer.RenderHtmlAsPdf("<h1>Document</h1>"); pdf.SignAndSave("signed.pdf", hsmSigner);Dim pdf = renderer.RenderHtmlAsPdf("<h1>Document</h1>") pdf.SignAndSave("signed.pdf", hsmSigner)$vbLabelText $csharpLabel - Verifique la firma en su visor de PDF
Añadir una firma a un documento PDF es un requisito habitual en aplicaciones de facturación y gestión documental. Sin embargo, las aplicaciones de misión crítica —como los sistemas de facturación certificados para TicketBAI o VeriFactu— requieren mayor seguridad. Una firma normal con un fichero .pfx carga la clave en la memoria: si el servidor se ve comprometido, la clave puede ser robada y usada para generar facturas fraudulentas.
Un HSM mantiene la clave privada generada dentro del dispositivo y nunca permite que salga. La aplicación proporciona un PIN, el HSM lleva a cabo la operación de firma internamente y retorna el documento firmado. La clave nunca sale del dispositivo.
Cómo firmar digitalmente archivos PDF con HSM
- Descargue la biblioteca IronPDF C# para firmar archivos PDF con HSM
- Importe su HSM existente o simúlelo con otras bibliotecas
- Crear un nuevo objeto
UsbPkcs11HsmSigner - Firme y guarde el PDF con
SignAndSave - Verifique la salida en PDF y el certificado con un visor de PDF
Firma HSM con certificados FNMT e IZENPE para TicketBAI
Para el caso de uso de TicketBAI en el País Vasco, es importante entender que cada diputación foral tiene especificaciones propias:
- Bizkaia (portal
bizkaia.eus, programa BATUZ): acepta firmas XAdES con certificados FNMT o IZENPE. - Gipuzkoa (
gipuzkoa.eus): especificaciones XAdES ligeramente distintas en los campos obligatorios del sobre de firma. - Araba (
araba.eus): comparte la arquitectura base de TicketBAI pero con su propio endpoint de validación.
IronPDF no es por sí mismo un sistema de facturación certificado para TicketBAI: es el componente que genera el PDF firmado que se incorpora al registro TicketBAI dentro de su sistema de facturación certificado. La firma con HSM garantiza que las claves de firma de su empresa permanecen seguras aunque el servidor de aplicación se vea comprometido.
¿Cómo firmar archivos PDF con un HSM?
La firma con HSM requiere un dispositivo físico (token USB) con el que interactúa la aplicación. IronPDF es compatible con estos dispositivos porque tanto la biblioteca como los HSMs estándar utilizan PKCS#11 como API común.
Para entornos de producción, utilice su HSM real. Para pruebas, puede usar SoftHSM.
Para ejecutar la simulación, primero instale SoftHSM, OpenSSL y OpenSC para generar la clave y el token necesarios.
El Iron Suite juega un papel crucial en nuestras operaciones. Estas son herramientas que aumentan la eficiencia en toda la empresa, incluyendo la creación de planos y la mejora en la gestión de inventario.
¿Qué aspecto tiene el código de firma HSM?
:path=/static-assets/pdf/content-code-examples/how-to/signing-with-hsm.cs
using IronPdf;
using IronPdf.Signing;
using IronSoftware.Pdfium.Signing;
using System.Drawing;
ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = renderer.RenderHtmlAsPdf("<h1>Testing</h1>");
// Define Paths and Credentials
string softhsmLibraryPath = @"D:\SoftHSM2\lib\softhsm2-x64.dll";
// These MUST match what you created
string hsmTokenLabel = "MyTestToken";
string hsmPin = "123456";
string hsmKeyLabel = "my-key"; // The label for the key *inside* the token
// Create the HsmSigner object.
UsbPkcs11HsmSigner hsmSigner = new UsbPkcs11HsmSigner(
softhsmLibraryPath,
hsmPin,
hsmTokenLabel,
hsmKeyLabel
);
// Create the Signature Image
string signatureImagePath = "IronSoftware.png";
PdfSignatureImage sigImage = new PdfSignatureImage(signatureImagePath, 0, new Rectangle(50, 50, 150, 150));
// Sign PDF with HSM
pdf.SignAndSave("signedWithHSM.pdf", hsmSigner);
Imports IronPdf
Imports IronPdf.Signing
Imports IronSoftware.Pdfium.Signing
Imports System.Drawing
Dim renderer As New ChromePdfRenderer()
Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf("<h1>Testing</h1>")
' Define Paths and Credentials
Dim softhsmLibraryPath As String = "D:\SoftHSM2\lib\softhsm2-x64.dll"
' These MUST match what you created
Dim hsmTokenLabel As String = "MyTestToken"
Dim hsmPin As String = "123456"
Dim hsmKeyLabel As String = "my-key" ' The label for the key *inside* the token
' Create the HsmSigner object.
Dim hsmSigner As New UsbPkcs11HsmSigner(softhsmLibraryPath, hsmPin, hsmTokenLabel, hsmKeyLabel)
' Create the Signature Image
Dim signatureImagePath As String = "IronSoftware.png"
Dim sigImage As New PdfSignatureImage(signatureImagePath, 0, New Rectangle(50, 50, 150, 150))
' Sign PDF with HSM
pdf.SignAndSave("signedWithHSM.pdf", hsmSigner)
El UsbPkcs11HsmSigner acepta dos parámetros opcionales: digestAlgorithm y signingAlgorithm. Por defecto, están configurados como SHA256 y RSA.
Configuración avanzada para PAdES y múltiples firmas
Para firmas PAdES requeridas por Crea y Crece en facturas B2B o para firmas eIDAS con valor probatorio cualificado:
// Configure with custom algorithms
var customHsmSigner = new UsbPkcs11HsmSigner(
hsmLibraryPath,
hsmPin,
hsmTokenLabel,
hsmKeyLabel,
digestAlgorithm: IronPdf.Signing.DigestAlgorithm.SHA512,
signingAlgorithm: IronPdf.Signing.SigningAlgorithm.RSA
);
// Apply signature with custom location and reason
var signatureOptions = new SignatureOptions
{
SignerName = "Corporate Signing Authority",
Location = "Company Headquarters",
Reason = "Contract Approval"
};
// Load existing PDF for signing
var existingPdf = PdfDocument.FromFile("contract.pdf");
existingPdf.SignAndSave("contract-signed.pdf", customHsmSigner, signatureOptions);
// Configure with custom algorithms
var customHsmSigner = new UsbPkcs11HsmSigner(
hsmLibraryPath,
hsmPin,
hsmTokenLabel,
hsmKeyLabel,
digestAlgorithm: IronPdf.Signing.DigestAlgorithm.SHA512,
signingAlgorithm: IronPdf.Signing.SigningAlgorithm.RSA
);
// Apply signature with custom location and reason
var signatureOptions = new SignatureOptions
{
SignerName = "Corporate Signing Authority",
Location = "Company Headquarters",
Reason = "Contract Approval"
};
// Load existing PDF for signing
var existingPdf = PdfDocument.FromFile("contract.pdf");
existingPdf.SignAndSave("contract-signed.pdf", customHsmSigner, signatureOptions);
Imports IronPdf
' Configure with custom algorithms
Dim customHsmSigner As New UsbPkcs11HsmSigner(
hsmLibraryPath,
hsmPin,
hsmTokenLabel,
hsmKeyLabel,
digestAlgorithm:=IronPdf.Signing.DigestAlgorithm.SHA512,
signingAlgorithm:=IronPdf.Signing.SigningAlgorithm.RSA
)
' Apply signature with custom location and reason
Dim signatureOptions As New SignatureOptions With {
.SignerName = "Corporate Signing Authority",
.Location = "Company Headquarters",
.Reason = "Contract Approval"
}
' Load existing PDF for signing
Dim existingPdf As PdfDocument = PdfDocument.FromFile("contract.pdf")
existingPdf.SignAndSave("contract-signed.pdf", customHsmSigner, signatureOptions)
¿Cuáles son los problemas comunes de configuración de HSM?
Si se encuentra con el error mostrado a continuación, siga estos pasos para depurar. Para ayuda adicional, consulte nuestra guía de solución de problemas de firmas digitales.
El error CKR_GENERAL_ERROR ocurre comúnmente cuando el programa no puede encontrar el fichero de configuración de SoftHSM o cuando la aplicación .NET se ejecuta como proceso de 32 bits mientras que la biblioteca de SoftHSM es de 64 bits.
Cambiar la plataforma de destino
Su aplicación C# debe ejecutarse como proceso de 64 bits para coincidir con la biblioteca de 64 bits de SoftHSM (CHOOSE_x64). En las propiedades del proyecto en Visual Studio, cambie el objetivo de la Plataforma de 'Any CPU' o 'x86' a x64.
Configuración de la variable de entorno
Indique a la biblioteca dónde buscar estableciendo una variable de entorno. Cree una nueva variable llamada SOFTHSM2_CONF con la ruta completa a su fichero de configuración (por ejemplo, D:\SoftHSM2\etc\softhsm2.conf). Reinicie Visual Studio después de realizar los cambios. softhsm2-x64.dll x64 SOFTHSM2_CONF
Para verificar que la variable está configurada:
Console.WriteLine($"Verifying variable: {Environment.GetEnvironmentVariable("SOFTHSM2_CONF")}");
Console.WriteLine($"Verifying variable: {Environment.GetEnvironmentVariable("SOFTHSM2_CONF")}");
Console.WriteLine($"Verifying variable: {Environment.GetEnvironmentVariable(""SOFTHSM2_CONF"")}")
Si la salida aparece en blanco, configure la variable, reinicie Visual Studio y vuelva a intentarlo.
Prácticas recomendadas para implantación HSM en producción
Al desplegar PDFs firmados con HSM para TicketBAI, Crea y Crece o eIDAS en entornos de producción:
- Registro de auditoría: implemente un registro exhaustivo de todas las operaciones HSM para el seguimiento de acceso y la conformidad con la LOPDGDD y los requisitos de auditoría de la AEAT
- Gestión de certificados FNMT/IZENPE: actualice y rote periódicamente los certificados conforme a las políticas de las autoridades de certificación. Los certificados FNMT tienen validez limitada y deben renovarse antes de su caducidad para evitar interrupciones en la facturación
- Procedimientos de copia de seguridad: establezca procedimientos adecuados de recuperación para configuraciones HSM. Una clave perdida sin respaldo impide firmar facturas, lo que puede paralizar la operación de facturación bajo VeriFactu o TicketBAI
- Optimización del rendimiento: supervise el rendimiento de firma e implemente estrategias de caché para certificados de acceso frecuente en sistemas de alta facturación como los requeridos por SII (Suministro Inmediato de Información) ante la AEAT
Estas prácticas complementan el flujo de firma de PDF y garantizan que su infraestructura de seguridad documental permanezca robusta ante inspecciones fiscales.
Preguntas Frecuentes
¿Qué es la firma HSM y en qué se diferencia de la firma normal de PDF?
La firma HSM (Hardware Security Module) con IronPDF proporciona seguridad a nivel bancario, donde las claves privadas nunca salen del dispositivo físico. A diferencia de la firma normal de archivos .pfx, en la que las claves se cargan en la memoria y pueden verse comprometidas si se ataca el ordenador, la firma HSM mantiene la clave privada bloqueada dentro del dispositivo de hardware, por lo que es imposible copiarla o robarla.
¿Cómo se configura la firma HSM en C# para PDF?
Para configurar la firma HSM con IronPDF, instale primero la biblioteca a través de NuGet con "Install-Package IronPDF" y, a continuación, cree un objeto UsbPkcs11HsmSigner con sus credenciales HSM, incluida la ruta de la biblioteca, el PIN, la etiqueta de token y la etiqueta de clave. Por último, utilice el método SignAndSave para firmar el documento PDF.
¿Cuáles son las ventajas de seguridad de utilizar HSM para las firmas PDF?
El uso de HSM con IronPDF proporciona firmas digitales a prueba de manipulaciones, ideales para aplicaciones de misión crítica. El proceso es como llevar documentos a la cámara acorazada de un banco: la aplicación proporciona un PIN, el HSM firma el documento internamente y devuelve el documento firmado sin exponer nunca la clave privada, lo que garantiza que no se pueda copiar ni robar.
¿Puedo probar la firma HSM sin un dispositivo físico?
Sí, IronPDF le permite simular la firma HSM utilizando bibliotecas como SoftHSM para fines de desarrollo y pruebas. Sin embargo, para entornos de producción, debe utilizar un dispositivo HSM físico real para garantizar una seguridad adecuada.
¿Qué estándar API utiliza IronPDF para la comunicación HSM?
IronPDF utiliza el estándar API PKCS#11 para la comunicación HSM, lo que garantiza la compatibilidad con los dispositivos HSM estándar. Esta API común permite a IronPDF interactuar sin problemas con varios tokens de hardware HSM y módulos de seguridad.
¿Cómo puedo verificar que mi PDF se ha firmado correctamente con HSM?
Después de firmar un PDF con la funcionalidad HSM de IronPDF, puede verificar la firma abriendo el PDF firmado en cualquier visor de PDF estándar. El visor mostrará la información de la firma digital y confirmará la autenticidad e integridad del documento.

