Migración de Aspose.PDF a IronPDF bajo VeriFactu: guía técnica para ISVs españoles
En IronPDF, "firma" significa tres cosas diferentes que no son intercambiables: una firma digital a prueba de manipulaciones respaldada por un certificado, un sello visual de una imagen manuscrita y un campo interactivo para que un usuario lo firme más tarde. Sus propiedades de seguridad difieren, por lo que los casos de uso se dividen según esa línea. El núcleo criptográfico es la clase PdfSignature con un X509Certificate2 cargado desde un archivo .pfx o .p12, aplicado con pdf.Sign(...). Eso une la identidad al contenido, por lo que cualquier edición posterior rompe la firma.
Contratos y acuerdos a prueba de manipulaciones
Es a lo que la mayoría de los equipos recurren primero. Una firma de certificado demuestra que el documento es auténtico y no ha sido alterado, y te permite incorporar una pista de auditoría (razón, ubicación, contacto, fecha) y una marca de tiempo confiable:
using IronPdf;
using IronPdf.Signing;
using System;
var pdf = PdfDocument.FromFile("contract.pdf");
var signature = new PdfSignature("certificate.pfx", "password")
{
SigningReason = "Contractual Agreement",
SigningLocation = "Chicago, USA",
SignatureDate = DateTime.Now,
TimeStampUrl = new Uri("http://timestamp.digicert.com"),
TimestampHashAlgorithm = TimestampHashAlgorithms.SHA256
};
pdf.Sign(signature);
pdf.SaveAs("contract-signed.pdf");Imports IronPdf
Imports IronPdf.Signing
Imports System
Dim pdf = PdfDocument.FromFile("contract.pdf")
Dim signature = New PdfSignature("certificate.pfx", "password") With {
.SigningReason = "Contractual Agreement",
.SigningLocation = "Chicago, USA",
.SignatureDate = DateTime.Now,
.TimeStampUrl = New Uri("http://timestamp.digicert.com"),
.TimestampHashAlgorithm = TimestampHashAlgorithms.SHA256
}
pdf.Sign(signature)
pdf.SaveAs("contract-signed.pdf")Una marca de tiempo de una autoridad confiable proporciona una prueba criptográfica de cuándo se firmó un documento, independiente del reloj local, lo cual es importante para documentos presentados y envíos regulados.
Bloquear documentos después de firmar
La configuración SignaturePermissions controla lo que está permitido a continuación: NoChangesAllowed bloquea el documento, FormFillingAllowed permite solo la entrada de campos, y AnnotationsAndFormFillingAllowed también permite notas. Cualquier acción no permitida invalida la firma, lo que es adecuado para certificados emitidos, políticas aprobadas y declaraciones finalizadas.
Flujos de aprobación multiparte
Debido a que los PDF admiten el guardado incremental, una firma se aplica a una revisión específica. Cada aprobador firma la suya, y el historial registra quién firmó qué, cuándo y qué cambió. Esto cubre la firma conjunta y la aprobación secuencial.
Verificación y puertas de auditoría
Un canal puede rechazar cualquier documento que no pase la verificación, luego retroceder o eliminar firmas:
var pdf = PdfDocument.FromFile("signed-report.pdf");
bool valid = pdf.VerifySignatures();
if (!valid)
{
pdf.RemoveSignatures();
pdf.SaveAs("report-unsigned.pdf");
}Dim pdf = PdfDocument.FromFile("signed-report.pdf")
Dim valid As Boolean = pdf.VerifySignatures()
If Not valid Then
pdf.RemoveSignatures()
pdf.SaveAs("report-unsigned.pdf")
End IfAprobación visible sin criptografía
Cuando solo necesitas el aspecto de una firma, no la no-repudiación legal, sella una imagen manuscrita escaneada con la característica de sello o marca de agua. Está bien para aprobaciones internas, siempre y cuando seas claro sobre lo que es.
Sello o certificado, y dos advertencias
Nunca dejes que una imagen estampada reemplace a una firma de certificado. Un sello son píxeles en una página: copiables, no verificables, sin garantía de que el documento no haya sido alterado. Una firma de certificado es a prueba de manipulaciones y une la identidad al contenido criptográficamente. Usa el sello para la apariencia, el certificado para la prueba.
Dos cosas atrapan a la gente desprevenida. Cargue el certificado con X509KeyStorageFlags.Exportable, o la clave privada no podrá usarse y la firma fallará. Y si un visor muestra una advertencia en lugar de una marca verde, el certificado no está en el almacén de confianza de ese visor; la firma sigue siendo válida, pero debe establecerse la confianza por separado.

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 estructurados y visualmente atractivos.