Cómo añadir firmas digitales PDF en ASP.NET Core
Agregar una firma digital a un PDF en ASP.NET Core protege la integridad del documento, confirma la identidad del firmante y hace que el archivo sea legalmente defendible en la mayoría de las jurisdicciones. Con IronPDF, puede firmar archivos PDF del lado del servidor usando archivos de certificado, agregar imágenes de firma visibles e integrar campos de formulario de firma interactivos, todo dentro de unas pocas líneas de código C#.
Instala la biblioteca desde NuGet, adquiere tu certificado .pfx, y sigue los ejemplos a continuación para construir un flujo de trabajo de firma de documentos listo para producción.
Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
También puede instalarlo a través del Administrador de paquetes NuGet dentro de Visual Studio o descargarlo directamente desde la página del producto IronPDF . Comienza una prueba gratuita para probar todas las características de firma sin compromiso.
¿Qué es una firma digital PDF y por qué es importante?
Una firma digital es un mecanismo criptográfico que vincula la identidad del firmante a una versión específica de un documento. Se diferencia de una firma electrónica simple (como un nombre escrito o una imagen escaneada) porque utiliza criptografía de clave pública para crear un sello verificable y a prueba de manipulaciones.
Cuando alguien firma digitalmente un PDF, el software de firma genera un hash del contenido del documento y cifra ese hash con la clave privada del firmante. La firma resultante se incrusta en el PDF junto con el certificado público del firmante. Cualquier lector de PDF que admita firmas digitales (incluido Adobe Acrobat Reader y los visores de PDF integrados en los navegadores modernos) puede descifrar el hash con la clave pública y compararlo con un hash recién calculado del documento. Si los hashes coinciden, el documento es auténtico y no está modificado.
Por qué las firmas digitales son legalmente importantes
En la mayoría de los países, los documentos firmados digitalmente tienen el mismo peso legal que los contratos en papel firmados a mano. Tanto el reglamento eIDAS de la Unión Europea como la Ley ESIGN de los Estados Unidos reconocen que las firmas electrónicas son legalmente vinculantes cuando se cumplen determinadas condiciones. Las firmas digitales basadas en certificados satisfacen el nivel más estricto de esos requisitos.
Dónde encajan las firmas digitales en ASP.NET Core
La firma del lado del servidor dentro de una aplicación ASP.NET Core le permite firmar documentos automáticamente durante el procesamiento; no se requiere software cliente. Los contratos, facturas, informes de cumplimiento y acuerdos de confidencialidad se pueden firmar en el momento en que se generan, y el archivo firmado se puede devolver directamente al usuario o almacenar en un sistema de gestión de documentos. IronPDF gestiona todo el proceso, desde la representación de HTML a PDF hasta la firma criptográfica, de modo que puede implementar el flujo de trabajo sin tocar detalles de especificación de PDF de bajo nivel.
¿Cómo instalar IronPDF en un proyecto ASP.NET Core ?
La ruta más rápida hacia un entorno de firma funcional es el paquete NuGet . Abra la consola del gestor de paquetes en Visual Studio y ejecute:
Install-Package IronPdf
dotnet add package IronPdf
Install-Package IronPdf
dotnet add package IronPdf
Alternativamente, haz clic derecho en el proyecto en el Explorador de Soluciones, elige "Administrar paquetes NuGet", busca IronPdf, y haz clic en Instalar. Después de la instalación, añade las siguientes directivas using en la parte superior de tu controlador o clase de servicio:
using IronPdf;
using IronPdf.Signing;
using IronPdf;
using IronPdf.Signing;
Imports IronPdf
Imports IronPdf.Signing
IronPDF está orientado a .NET 8 y .NET 9/10, por lo que se adapta naturalmente a los proyectos ASP.NET Core modernos. Para obtener una guía detallada sobre la configuración inicial, consulte la guía de inicio rápido de IronPDF .
¿Cómo firmar un PDF con un archivo de certificado en ASP.NET Core?
El enfoque de firma más común utiliza un archivo de certificado .pfx o .p12. Estos archivos agrupan la clave privada y la cadena de certificados públicos en un único archivo protegido por contraseña. Puedes obtener uno de una autoridad certificadora (CA) de confianza como DigiCert o GlobalSign, o generar un certificado autofirmado para desarrollo y prueba.
El siguiente ejemplo genera un PDF a partir de HTML y aplica una firma digital basada en certificado:
using IronPdf;
using IronPdf.Signing;
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapPost("/sign-with-certificate", (IWebHostEnvironment env) =>
{
// Generate a PDF from HTML content
var renderer = new ChromePdfRenderer();
var document = renderer.RenderHtmlAsPdf("<h1>Contract Agreement</h1><p>Terms and conditions...</p>");
// Locate the PFX certificate on the server
string certPath = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx");
// Build the signature object
var signature = new PdfSignature(certPath, "yourPassword")
{
SigningContact = "legal@yourcompany.com",
SigningLocation = "Chicago, IL, USA",
SigningReason = "Document Approval"
};
// Apply the signature and save
document.Sign(signature);
string outputPath = Path.Combine(Path.GetTempPath(), "signed-contract.pdf");
document.SaveAs(outputPath);
return Results.File(outputPath, "application/pdf", "signed-contract.pdf");
});
app.Run();
using IronPdf;
using IronPdf.Signing;
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapPost("/sign-with-certificate", (IWebHostEnvironment env) =>
{
// Generate a PDF from HTML content
var renderer = new ChromePdfRenderer();
var document = renderer.RenderHtmlAsPdf("<h1>Contract Agreement</h1><p>Terms and conditions...</p>");
// Locate the PFX certificate on the server
string certPath = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx");
// Build the signature object
var signature = new PdfSignature(certPath, "yourPassword")
{
SigningContact = "legal@yourcompany.com",
SigningLocation = "Chicago, IL, USA",
SigningReason = "Document Approval"
};
// Apply the signature and save
document.Sign(signature);
string outputPath = Path.Combine(Path.GetTempPath(), "signed-contract.pdf");
document.SaveAs(outputPath);
return Results.File(outputPath, "application/pdf", "signed-contract.pdf");
});
app.Run();
Imports IronPdf
Imports IronPdf.Signing
Imports Microsoft.AspNetCore.Mvc
Dim builder = WebApplication.CreateBuilder(args)
Dim app = builder.Build()
app.MapPost("/sign-with-certificate", Function(env As IWebHostEnvironment)
' Generate a PDF from HTML content
Dim renderer = New ChromePdfRenderer()
Dim document = renderer.RenderHtmlAsPdf("<h1>Contract Agreement</h1><p>Terms and conditions...</p>")
' Locate the PFX certificate on the server
Dim certPath As String = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx")
' Build the signature object
Dim signature = New PdfSignature(certPath, "yourPassword") With {
.SigningContact = "legal@yourcompany.com",
.SigningLocation = "Chicago, IL, USA",
.SigningReason = "Document Approval"
}
' Apply the signature and save
document.Sign(signature)
Dim outputPath As String = Path.Combine(Path.GetTempPath(), "signed-contract.pdf")
document.SaveAs(outputPath)
Return Results.File(outputPath, "application/pdf", "signed-contract.pdf")
End Function)
app.Run()
ChromePdfRenderer convierte cualquier cadena HTML válida o URL en un PDF. El constructor PdfSignature acepta la ruta del certificado y la contraseña, y las propiedades opcionales (SigningContact, SigningLocation, SigningReason) añaden metadatos que los visores PDF muestran en el panel de firmas. El método Sign incrusta la firma criptográfica, y SaveAs escribe el archivo firmado en el disco.
Devolver el archivo firmado desde la memoria
Cuando no deseas escribir un archivo temporal en el disco, guarda el PDF en un MemoryStream y devuélvelo directamente desde la acción del controlador:
var stream = new MemoryStream();
document.SaveAs(stream);
stream.Position = 0;
return Results.File(stream, "application/pdf", "signed-contract.pdf");
var stream = new MemoryStream();
document.SaveAs(stream);
stream.Position = 0;
return Results.File(stream, "application/pdf", "signed-contract.pdf");
Dim stream As New MemoryStream()
document.SaveAs(stream)
stream.Position = 0
Return Results.File(stream, "application/pdf", "signed-contract.pdf")
Este enfoque es adecuado para API de alto rendimiento donde la gestión de archivos temporales agregaría una sobrecarga innecesaria.
Para una referencia completa de propiedades, ve la documentación de la API PdfSignature.
¿Cómo agregar una imagen de firma visible a un PDF?
Las firmas criptográficas protegen la integridad del documento, pero son invisibles en el PDF renderizado. Muchos flujos de trabajo, en particular aquellos que involucran contratos o cartas, también requieren una representación visible, como una firma manuscrita escaneada o un sello de la empresa, impreso en la página.
IronPDF admite esto a través del método LoadSignatureImageFromFile. El método acepta una ruta de imagen, un índice de página, y un IronSoftware.Drawing.Rectangle que define la posición y dimensiones de la firma visible:
using IronPdf;
using IronPdf.Signing;
using IronSoftware.Drawing;
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapPost("/sign-with-visible-image", (IWebHostEnvironment env) =>
{
// Load an existing PDF (for example, an invoice template)
string pdfPath = Path.Combine(env.ContentRootPath, "Documents", "invoice.pdf");
var document = PdfDocument.FromFile(pdfPath);
// Paths to the certificate and the signature image
string certPath = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx");
string imagePath = Path.Combine(env.ContentRootPath, "Images", "signature.png");
// Define where the visible signature appears (x, y, width, height in points)
var signatureArea = new Rectangle(50, 680, 200, 80);
var signature = new PdfSignature(certPath, "yourPassword");
signature.LoadSignatureImageFromFile(imagePath, pageIndex: 0, signatureArea);
document.Sign(signature);
string outputPath = Path.Combine(Path.GetTempPath(), "signed-invoice.pdf");
document.SaveAs(outputPath);
return Results.File(outputPath, "application/pdf", "signed-invoice.pdf");
});
app.Run();
using IronPdf;
using IronPdf.Signing;
using IronSoftware.Drawing;
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapPost("/sign-with-visible-image", (IWebHostEnvironment env) =>
{
// Load an existing PDF (for example, an invoice template)
string pdfPath = Path.Combine(env.ContentRootPath, "Documents", "invoice.pdf");
var document = PdfDocument.FromFile(pdfPath);
// Paths to the certificate and the signature image
string certPath = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx");
string imagePath = Path.Combine(env.ContentRootPath, "Images", "signature.png");
// Define where the visible signature appears (x, y, width, height in points)
var signatureArea = new Rectangle(50, 680, 200, 80);
var signature = new PdfSignature(certPath, "yourPassword");
signature.LoadSignatureImageFromFile(imagePath, pageIndex: 0, signatureArea);
document.Sign(signature);
string outputPath = Path.Combine(Path.GetTempPath(), "signed-invoice.pdf");
document.SaveAs(outputPath);
return Results.File(outputPath, "application/pdf", "signed-invoice.pdf");
});
app.Run();
Imports IronPdf
Imports IronPdf.Signing
Imports IronSoftware.Drawing
Imports Microsoft.AspNetCore.Mvc
Dim builder = WebApplication.CreateBuilder(args)
Dim app = builder.Build()
app.MapPost("/sign-with-visible-image", Function(env As IWebHostEnvironment)
' Load an existing PDF (for example, an invoice template)
Dim pdfPath As String = Path.Combine(env.ContentRootPath, "Documents", "invoice.pdf")
Dim document = PdfDocument.FromFile(pdfPath)
' Paths to the certificate and the signature image
Dim certPath As String = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx")
Dim imagePath As String = Path.Combine(env.ContentRootPath, "Images", "signature.png")
' Define where the visible signature appears (x, y, width, height in points)
Dim signatureArea As New Rectangle(50, 680, 200, 80)
Dim signature As New PdfSignature(certPath, "yourPassword")
signature.LoadSignatureImageFromFile(imagePath, pageIndex:=0, signatureArea)
document.Sign(signature)
Dim outputPath As String = Path.Combine(Path.GetTempPath(), "signed-invoice.pdf")
document.SaveAs(outputPath)
Return Results.File(outputPath, "application/pdf", "signed-invoice.pdf")
End Function)
app.Run()
La imagen visible de la firma se compone en la página especificada, en las coordenadas que proporcione. La firma criptográfica se aplica simultáneamente a todo el documento, lo que le permite obtener seguridad y confirmación visual en una sola operación.
Si la imagen reside en la memoria (obtenida de una base de datos o almacenamiento en la nube, por ejemplo), usa LoadSignatureImageFromStream en su lugar. Para obtener una visión más profunda de las opciones de firma visual, consulte la guía práctica de firma en PDF .
¿Cómo crear campos de formulario de firma para firmantes externos?
En algunos flujos de trabajo, el documento lo crea su sistema, pero debe estar firmado por una parte externa: un cliente, un socio o un organismo regulador. En lugar de recoger un certificado de esa parte por adelantado, usted integra un campo de formulario de firma dedicado en el PDF y les envía el documento. Los destinatarios abren el PDF en Adobe Acrobat Reader u otro visor compatible, hacen clic en el campo de firma y aplican su propio certificado o firma electrónica.
using IronPdf;
using IronPdf.Forms;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/generate-signable-form", (IWebHostEnvironment env) =>
{
// Render the document that requires a client signature
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(@"
<h1>Client Service Agreement</h1>
<p>Please review the terms below and sign in the field provided.</p>
<p>By signing, you confirm acceptance of all listed terms and conditions.</p>
");
// Define the signature field: name, page, x, y, width, height (in points)
var signatureField = new SignatureFormField(
"ClientSignature",
pageIndex: 0,
x: 50,
y: 600,
width: 300,
height: 100
);
pdf.Form.Add(signatureField);
string outputPath = Path.Combine(Path.GetTempPath(), "client-agreement.pdf");
pdf.SaveAs(outputPath);
return Results.File(outputPath, "application/pdf", "client-agreement.pdf");
});
app.Run();
using IronPdf;
using IronPdf.Forms;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/generate-signable-form", (IWebHostEnvironment env) =>
{
// Render the document that requires a client signature
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(@"
<h1>Client Service Agreement</h1>
<p>Please review the terms below and sign in the field provided.</p>
<p>By signing, you confirm acceptance of all listed terms and conditions.</p>
");
// Define the signature field: name, page, x, y, width, height (in points)
var signatureField = new SignatureFormField(
"ClientSignature",
pageIndex: 0,
x: 50,
y: 600,
width: 300,
height: 100
);
pdf.Form.Add(signatureField);
string outputPath = Path.Combine(Path.GetTempPath(), "client-agreement.pdf");
pdf.SaveAs(outputPath);
return Results.File(outputPath, "application/pdf", "client-agreement.pdf");
});
app.Run();
Imports IronPdf
Imports IronPdf.Forms
Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Hosting
Imports Microsoft.Extensions.Hosting
Dim builder = WebApplication.CreateBuilder(args)
Dim app = builder.Build()
app.MapGet("/generate-signable-form", Function(env As IWebHostEnvironment)
' Render the document that requires a client signature
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("
<h1>Client Service Agreement</h1>
<p>Please review the terms below and sign in the field provided.</p>
<p>By signing, you confirm acceptance of all listed terms and conditions.</p>
")
' Define the signature field: name, page, x, y, width, height (in points)
Dim signatureField = New SignatureFormField(
"ClientSignature",
pageIndex:=0,
x:=50,
y:=600,
width:=300,
height:=100
)
pdf.Form.Add(signatureField)
Dim outputPath As String = Path.Combine(Path.GetTempPath(), "client-agreement.pdf")
pdf.SaveAs(outputPath)
Return Results.File(outputPath, "application/pdf", "client-agreement.pdf")
End Function)
app.Run()
Los parámetros del constructor SignatureFormField se asignan directamente a la posición del campo en la página. Cuando el destinatario abre el PDF, ve un cuadro claramente delimitado donde debe ir su firma. Luego, el formulario completo puede devolverse a su sistema, donde podrá cargarlo, validar la firma incorporada y archivarlo.
Para obtener más información sobre el manejo de formularios PDF, incluida la lectura de los datos del formulario enviado, consulte la guía de edición de formularios PDF .
¿Cómo se verifica una firma digital mediante programación?
Después de firmar y devolver un documento, es posible que deba verificar que la firma aún sea válida y que el documento no haya sido alterado. IronPDF expone la verificación de firma a través del objeto PdfDocument:
using IronPdf;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/verify-signature", (IWebHostEnvironment env) =>
{
string signedPath = Path.Combine(env.ContentRootPath, "Documents", "signed-contract.pdf");
var document = PdfDocument.FromFile(signedPath);
// Retrieve all embedded signatures
var signatures = document.GetSignatures();
foreach (var sig in signatures)
{
bool isValid = sig.VerifySignature();
string status = isValid
? $"Valid -- signed by {sig.SignerName} on {sig.SigningTime:D}"
: "INVALID -- document may have been tampered with";
Console.WriteLine(status);
}
return Results.Ok(new { SignatureCount = signatures.Count });
});
app.Run();
using IronPdf;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/verify-signature", (IWebHostEnvironment env) =>
{
string signedPath = Path.Combine(env.ContentRootPath, "Documents", "signed-contract.pdf");
var document = PdfDocument.FromFile(signedPath);
// Retrieve all embedded signatures
var signatures = document.GetSignatures();
foreach (var sig in signatures)
{
bool isValid = sig.VerifySignature();
string status = isValid
? $"Valid -- signed by {sig.SignerName} on {sig.SigningTime:D}"
: "INVALID -- document may have been tampered with";
Console.WriteLine(status);
}
return Results.Ok(new { SignatureCount = signatures.Count });
});
app.Run();
Imports IronPdf
Imports Microsoft.AspNetCore.Builder
Imports Microsoft.AspNetCore.Hosting
Imports Microsoft.Extensions.Hosting
Dim builder = WebApplication.CreateBuilder(args)
Dim app = builder.Build()
app.MapGet("/verify-signature", Function(env As IWebHostEnvironment)
Dim signedPath As String = Path.Combine(env.ContentRootPath, "Documents", "signed-contract.pdf")
Dim document = PdfDocument.FromFile(signedPath)
' Retrieve all embedded signatures
Dim signatures = document.GetSignatures()
For Each sig In signatures
Dim isValid As Boolean = sig.VerifySignature()
Dim status As String = If(isValid,
$"Valid -- signed by {sig.SignerName} on {sig.SigningTime:D}",
"INVALID -- document may have been tampered with")
Console.WriteLine(status)
Next
Return Results.Ok(New With {.SignatureCount = signatures.Count})
End Function)
app.Run()
GetSignatures() devuelve una lista de todas las firmas digitales incrustadas en el PDF. Cada objeto PdfDigitalSignature expone VerifySignature(), el nombre del firmante, la marca de tiempo de la firma, y la cadena de certificados. Esta información es suficiente para crear un registro de auditoría o un panel de gestión de documentos que marque cualquier PDF con firmas rotas o vencidas.
¿Cómo se gestiona la gestión de certificados en producción?
Almacenar un archivo .pfx en el sistema de archivos funciona durante el desarrollo, pero no es adecuado para producción. Los archivos de certificado contienen claves privadas y, si el archivo se ve comprometido, todos los documentos firmados con esa clave están en riesgo.
Uso de Azure Key Vault
Azure Key Vault le permite almacenar y usar certificados sin que la clave privada salga del almacén. El SDK de .NET proporciona un CertificateClient que descarga la información del certificado público. Para las operaciones de firma reales que mantienen la clave privada dentro de Key Vault, puede usar el paquete Azure.Security.KeyVault.Keys para realizar la operación criptográfica del lado del servidor.
Uso de variables de entorno y secretos
Para proyectos más pequeños, almacene el certificado como una cadena codificada en Base64 en una variable de entorno o en el Administrador de secretos de ASP.NET Core y descodifíquelo en tiempo de ejecución:
string certBase64 = Environment.GetEnvironmentVariable("PDF_SIGNING_CERT")
?? throw new InvalidOperationException("PDF_SIGNING_CERT environment variable is not set.");
byte[] certBytes = Convert.FromBase64String(certBase64);
string certPassword = Environment.GetEnvironmentVariable("PDF_SIGNING_CERT_PASSWORD")
?? throw new InvalidOperationException("PDF_SIGNING_CERT_PASSWORD environment variable is not set.");
var signature = new PdfSignature(certBytes, certPassword);
string certBase64 = Environment.GetEnvironmentVariable("PDF_SIGNING_CERT")
?? throw new InvalidOperationException("PDF_SIGNING_CERT environment variable is not set.");
byte[] certBytes = Convert.FromBase64String(certBase64);
string certPassword = Environment.GetEnvironmentVariable("PDF_SIGNING_CERT_PASSWORD")
?? throw new InvalidOperationException("PDF_SIGNING_CERT_PASSWORD environment variable is not set.");
var signature = new PdfSignature(certBytes, certPassword);
Imports System
Dim certBase64 As String = Environment.GetEnvironmentVariable("PDF_SIGNING_CERT")
If certBase64 Is Nothing Then
Throw New InvalidOperationException("PDF_SIGNING_CERT environment variable is not set.")
End If
Dim certBytes As Byte() = Convert.FromBase64String(certBase64)
Dim certPassword As String = Environment.GetEnvironmentVariable("PDF_SIGNING_CERT_PASSWORD")
If certPassword Is Nothing Then
Throw New InvalidOperationException("PDF_SIGNING_CERT_PASSWORD environment variable is not set.")
End If
Dim signature = New PdfSignature(certBytes, certPassword)
Este patrón mantiene las credenciales fuera del control de origen y hace que la rotación sea sencilla: actualice la variable de entorno y reinicie el servicio.
¿Cómo firmar varios archivos PDF por lotes de manera eficiente?
Cuando necesitas firmar docenas o cientos de documentos en una operación -- por ejemplo, firmar un lote completo de facturas al final del mes -- cargar el certificado una vez y reutilizar el objeto PdfSignature en todos los documentos reduce la sobrecarga:
using IronPdf;
using IronPdf.Signing;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapPost("/batch-sign", (IWebHostEnvironment env) =>
{
string certPath = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx");
var signature = new PdfSignature(certPath, "yourPassword")
{
SigningReason = "Batch Invoice Approval"
};
string[] invoicePaths = Directory.GetFiles(
Path.Combine(env.ContentRootPath, "Invoices"),
"*.pdf"
);
string outputDir = Path.Combine(env.ContentRootPath, "Signed");
Directory.CreateDirectory(outputDir);
foreach (string invoicePath in invoicePaths)
{
var doc = PdfDocument.FromFile(invoicePath);
doc.Sign(signature);
string outputFile = Path.Combine(outputDir, Path.GetFileName(invoicePath));
doc.SaveAs(outputFile);
}
return Results.Ok(new { SignedCount = invoicePaths.Length });
});
app.Run();
using IronPdf;
using IronPdf.Signing;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapPost("/batch-sign", (IWebHostEnvironment env) =>
{
string certPath = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx");
var signature = new PdfSignature(certPath, "yourPassword")
{
SigningReason = "Batch Invoice Approval"
};
string[] invoicePaths = Directory.GetFiles(
Path.Combine(env.ContentRootPath, "Invoices"),
"*.pdf"
);
string outputDir = Path.Combine(env.ContentRootPath, "Signed");
Directory.CreateDirectory(outputDir);
foreach (string invoicePath in invoicePaths)
{
var doc = PdfDocument.FromFile(invoicePath);
doc.Sign(signature);
string outputFile = Path.Combine(outputDir, Path.GetFileName(invoicePath));
doc.SaveAs(outputFile);
}
return Results.Ok(new { SignedCount = invoicePaths.Length });
});
app.Run();
Imports IronPdf
Imports IronPdf.Signing
Dim builder = WebApplication.CreateBuilder(args)
Dim app = builder.Build()
app.MapPost("/batch-sign", Function(env As IWebHostEnvironment)
Dim certPath As String = Path.Combine(env.ContentRootPath, "Certificates", "certificate.pfx")
Dim signature As New PdfSignature(certPath, "yourPassword") With {
.SigningReason = "Batch Invoice Approval"
}
Dim invoicePaths As String() = Directory.GetFiles(
Path.Combine(env.ContentRootPath, "Invoices"),
"*.pdf"
)
Dim outputDir As String = Path.Combine(env.ContentRootPath, "Signed")
Directory.CreateDirectory(outputDir)
For Each invoicePath As String In invoicePaths
Dim doc = PdfDocument.FromFile(invoicePath)
doc.Sign(signature)
Dim outputFile As String = Path.Combine(outputDir, Path.GetFileName(invoicePath))
doc.SaveAs(outputFile)
Next
Return Results.Ok(New With {.SignedCount = invoicePaths.Length})
End Function)
app.Run()
Crear el objeto PdfSignature una vez fuera del bucle significa que el archivo de certificado se lee y analiza solo una vez. Cada iteración carga, firma y guarda un PDF individual. Para lotes muy grandes, considera procesar documentos en paralelo usando Parallel.ForEach -- Las operaciones de firma de IronPDF son seguras para hilos cuando cada instancia de PdfDocument está aislada a un solo hilo.
¿Cómo solucionar errores de firma comunes?
"Certificado no encontrado" o "Contraseña no válida"
Verifica doblemente la ruta del certificado usando File.Exists(certPath) antes de pasarlo a PdfSignature. Las contraseñas de los certificados distinguen entre mayúsculas y minúsculas y deben coincidir exactamente. En desarrollo, es común generar un certificado autofirmado con una contraseña simple; En producción, trate la contraseña como un secreto y cárguela desde un administrador de secretos.
"La firma no es válida" en el visor de PDF
Una advertencia de "firma no válida" en Adobe Acrobat generalmente significa una de tres cosas: (1) el almacén de certificados del visor no confía en el certificado, (2) el documento se modificó después de la firma o (3) el certificado de firma ha expirado. Para uso en producción, obtenga un certificado de una CA confiable y asegúrese de que el reloj del sistema esté sincronizado. Para el desarrollo, Adobe proporciona instrucciones para confiar temporalmente en los certificados autofirmados.
"El documento no está firmado" después de llamar a Sign()
Llamar a document.Sign(signature) marca el documento para firmar, pero la firma solo se finaliza cuando llamas a SaveAs o guardas en un flujo. Asegúrate de llamar al método de guardado después de Sign, y verifica que la ruta del archivo de salida sea escribible.
Para obtener detalles completos de la API y recursos para la resolución de problemas, visite el centro de documentación de IronPDF y la referencia de objetos de IronPDF . Si necesita ayuda, la página de soporte de IronPDF lo conecta con el equipo de ingeniería.
¿Cuales son tus próximos pasos?
La firma digital de PDF en ASP.NET Core se vuelve sencilla una vez que entiendes las tres operaciones principales: cargar un certificado, llamar a Sign, y guardar el resultado. IronPDF se encarga del pesado trabajo criptográfico para que usted pueda concentrarse en la lógica comercial de su aplicación.
Para continuar desarrollando su flujo de trabajo de documentos, explore estos temas relacionados:
- Cómo generar PDFs desde HTML en ASP.NET Core -- la base para la mayoría de los flujos de trabajo de firma
- Cómo agregar contraseñas y permisos a PDF : combine la firma con el cifrado para obtener la máxima seguridad
- Cómo fusionar y dividir archivos PDF : ensamblar paquetes de varios documentos antes de firmarlos
- Opciones de licencia de IronPDF : elija el plan que se adapte a su implementación
- Paquete NuGet IronPDF : consulte la última versión y el registro de cambios
Comienza con una prueba gratuita de IronPDF y ten tu primer PDF firmado en funcionamiento en menos de una hora. Si tiene preguntas o se encuentra con casos extremos, el equipo de soporte de Iron Software está disponible para ayudarlo a brindar un flujo de trabajo de firma de documentos confiable y que cumpla con las leyes.
Preguntas Frecuentes
¿Qué es una firma digital en ASP.NET Core?
Una firma digital en ASP.NET Core es como un sello de lacre digital que se utiliza para verificar la autenticidad y la integridad de los documentos PDF. Garantiza que los documentos son legalmente válidos y no han sido manipulados.
¿Cómo puedo añadir una firma digital a un documento PDF con IronPDF?
Puede añadir una firma digital a un documento PDF mediante IronPDF incluyendo un certificado y configurándolo para que firme el documento, garantizando que sea seguro y verificable.
¿Por qué son importantes las firmas digitales para mis documentos empresariales?
Las firmas digitales son cruciales porque verifican que documentos como contratos o facturas son auténticos y no han sido modificados, protegiendo así a su empresa de posibles riesgos legales.
¿Puedo crear campos de formulario interactivos en PDF con IronPDF?
Sí, IronPDF permite crear campos de formulario interactivos en PDF, lo que puede mejorar la interacción del usuario y agilizar los procesos de documentos en aplicaciones ASP.NET Core.
¿Es posible añadir firmas visibles a mis documentos PDF?
Sí, con IronPDF puede añadir firmas visibles a sus documentos PDF, dejando claro a los destinatarios que el documento está firmado y verificado de forma segura.
¿Qué tipos de certificados pueden utilizarse para las firmas digitales en PDF?
Puede utilizar varios tipos de certificados para las firmas digitales en PDF, incluidos los certificados autofirmados y los emitidos por una autoridad de certificación de confianza, en función del nivel de seguridad y confianza requerido.
¿Cómo garantiza IronPDF que un documento PDF no ha sido manipulado?
IronPDF garantiza que un documento PDF no ha sido manipulado mediante el uso de firmas digitales que validan la integridad y autenticidad del documento, alertando a los destinatarios si se han realizado cambios después de la firma.
¿Puedo automatizar el proceso de firma digital en aplicaciones ASP.NET Core?
Sí, puede automatizar el proceso de firma digital en aplicaciones ASP.NET Core mediante IronPDF, que permite el procesamiento por lotes y la integración en flujos de trabajo existentes.


