Cómo firmar digitalmente archivos PDF con C# usando HSM

This article was translated from English: Does it need improvement?
Translated
View the article in English

Añadir una firma a un documento PDF es un requisito común en muchas aplicaciones. Sin embargo, las aplicaciones de misión crítica requieren un mayor nivel de seguridad en el que la propia clave no pueda ser manipulada. Una operación de firma normal con un archivo .pfx es similar a tener una llave maestra en casa. La aplicación necesita cargar la clave en la memoria del ordenador para firmar el documento. Si el ordenador se ve comprometido, la clave puede ser robada.

Una alternativa mucho más segura es utilizar un Hardware Security Module (HSM). Con un HSM (como tu token USB), la clave privada se genera dentro del dispositivo y es físicamente incapaz de salir de él.

Este proceso es similar a llevar el documento al banco. La aplicación proporciona un PIN, y el "gestor del banco" (el HSM) lleva el documento a la cámara acorazada, lo sella con la llave y devuelve el documento sellado. El aspecto principal es que la llave nunca salga de la cámara acorazada. Esto proporciona una medida de seguridad adicional, ya que la clave no se puede copiar ni robar.

Comience a usar IronPDF en su proyecto hoy con una prueba gratuita.

Primer Paso:
green arrow pointer

Firma con un HSM

La firma con un HSM suele requerir un dispositivo físico, como un token USB, con el que interactúa la aplicación. IronPDF es totalmente compatible con estas operaciones, ya que tanto la biblioteca como los HSM estándar suelen utilizar PKCS#11 como API común. A efectos de demostración de la funcionalidad de IronPDF con HSM, en esta guía se utilizará un HSM simulado en lugar de uno físico.

En un entorno de producción o de pruebas en vivo, no debe utilizar esta simulación. En su lugar, debe utilizar su HSM real.

Para ejecutar esta simulación, primero debe instalar SoftHSM, OpenSSL y OpenSC para generar la clave y el token necesarios. Para obtener más información sobre cómo utilizar SoftHSM, consulte su repositorio público de GitHub.

Empezaremos creando un PDF a partir de una cadena HTML. En el ejemplo siguiente, definimos las rutas y credenciales para nuestro SoftHSM simulado. Esto incluye proporcionar la ruta absoluta al archivo de biblioteca SoftHSM .dll y al archivo de certificado .crt que ha creado.

A continuación, especificamos la ruta de salida, que en este caso es output.pdf.

Además, definimos tres cadenas: hsmTokenLabel, hsmPin y hsmKeyLabel. Estas cadenas distinguen entre mayúsculas y minúsculas y deben coincidir exactamente con las credenciales que creó al generar el token y el certificado con SoftHSM. A continuación, inicializamos el objeto UsbPkcs11HsmSigner, pasando como parámetros la ruta de la biblioteca SoftHSM, el PIN, la etiqueta del token y la etiqueta de la clave.

Además, creamos un PdfSignatureImage para añadir una representación visual de la firma en el documento. Por último, llamamos a SignAndSave, que utiliza el hsmSigner que hemos configurado para firmar el documento y guardarlo en la ruta de salida especificada.

Código

: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);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

El UsbPkcs11HsmSigner toma además dos parámetros opcionales, el digestAlgorithm y el signingAlgorithm. Por defecto, se establecen en SHA256 y RSA.

Resultado

A continuación se muestra el resultado generado. Como puedes ver, muestra el campo de firma y confirma que está firmado con el certificado que hemos generado.

Salida
Certificado de resultado

Solución de problemas

Si se encuentra con el error que se muestra a continuación mientras ejecuta el ejemplo de código, siga estos pasos de solución de problemas para depurar y verificar su configuración. Este CKR_GENERAL_ERROR suele producirse cuando el programa no puede encontrar el archivo de configuración de SoftHSM o cuando la aplicación .NET se ejecuta como un proceso de 32 bits mientras que la biblioteca SoftHSM es de 64 bits.

Error general de CKS

Cambiar la plataforma de destino

Una causa común de este error es un desajuste de arquitectura. Su aplicación C# debe ejecutarse como un proceso de 64 bits para que coincida con la biblioteca SoftHSM de 64 bits (softhsm2-x64.dll). En las propiedades del proyecto de Visual Studio, cambie el objetivo de plataforma de "Cualquier CPU" o "x86" a "x64" para garantizar la compatibilidad.

Plataforma objetivo

Configuración de la variable de entorno

Otra causa común de error es que el programa no puede encontrar el archivo .conf en SoftHSM. Debe indicar a la biblioteca dónde buscar estableciendo una variable de entorno para todo el sistema. Cree una nueva variable llamada SOFTHSM2_CONF y establezca su valor en la ruta completa de su archivo de configuración (por ejemplo, D:\SoftHSM2\etc\softhsm2.conf). A continuación, recuerda reiniciar Visual Studio tras realizar los cambios.

Establecer variable de entorno

Además, puede comprobar si se encuentra la variable añadiendo esta línea.

Console.WriteLine($"Verifying variable: {Environment.GetEnvironmentVariable("SOFTHSM2_CONF")}");
Console.WriteLine($"Verifying variable: {Environment.GetEnvironmentVariable("SOFTHSM2_CONF")}");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Si la salida de la consola está en blanco, el programa no puede encontrar la variable de entorno. Debes configurarlo, reiniciar Visual Studio o tu ordenador e intentarlo de nuevo.

Preguntas Frecuentes

¿Qué es un módulo de seguridad de hardware (HSM) y por qué se utiliza para firmar archivos PDF?

Un Módulo de Seguridad de Hardware (HSM) es un dispositivo físico que gestiona claves digitales y realiza funciones de cifrado y descifrado. Se utiliza para firmar archivos PDF y mejorar la seguridad, garantizando que el proceso de firma sea seguro y cumpla con diversos estándares.

¿Cómo puedo configurar un HSM para firmar archivos PDF en C#?

Para configurar un HSM para firmar archivos PDF en C#, debe configurar el HSM con los controladores y el software adecuados, asegurarse de que esté conectado a su sistema y configurar el proceso de firma dentro de su aplicación C# usando IronPDF.

¿Cuáles son los pasos para firmar digitalmente un PDF usando IronPDF?

Para firmar digitalmente un PDF con IronPDF, primero debe inicializar su HSM, configurar la firma digital dentro de su código C# y aplicar la firma al documento PDF utilizando la funcionalidad de firma de IronPDF.

¿Puedo usar IronPDF para firmar archivos PDF con otros tipos de certificados digitales?

Sí, IronPDF permite firmar archivos PDF con varios tipos de certificados digitales, no solo los administrados por un HSM. Esto incluye certificados almacenados en almacenes de claves de software.

¿Cuáles son los beneficios de utilizar IronPDF para firmar PDF?

IronPDF ofrece una API sencilla para firmar archivos PDF, lo que le permite integrar fácilmente firmas digitales en sus aplicaciones C#. Admite varios tipos de certificados, incluidos los administrados por HSM, lo que garantiza flexibilidad y seguridad.

¿Es posible verificar una firma PDF creada con IronPDF?

Sí, una vez que se firma un PDF con IronPDF, la firma se puede verificar utilizando lectores de PDF estándar que admiten firmas digitales, lo que garantiza la integridad y autenticidad del documento.

¿Necesito tener experiencia en programación para utilizar IronPDF para firmar archivos PDF?

Se recomiendan conocimientos básicos de programación en C# para utilizar IronPDF para firmar archivos PDF, ya que implica escribir código para administrar el proceso de firma y configurar el HSM adecuadamente.

¿Qué tipo de soporte está disponible para integrar HSM con IronPDF?

Iron Software proporciona documentación y soporte técnico para ayudarlo a integrar HSM con IronPDF, garantizando una configuración y un funcionamiento sin problemas de las funcionalidades de firma digital.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más
¿Listo para empezar?
Nuget Descargas 16,493,056 | Version: 2025.11 recién lanzado