Esta página puede contener texto traducido automáticamente.
Agregar información de Validación a Largo Plazo (PAdES-LTV) a las firmas de PDF en C# y VB.NET
La información de Validación a Largo Plazo (LTV) para firmas PDF ayuda a verificar firmas digitales mucho tiempo después de su creación. Sin LTV, una firma digital deja de poder verificarse una vez que el certificado del firmante expira o los datos de revocación ya no están disponibles. Esto suele ser inaceptable para documentos PDF legales y financieros que deben seguir siendo confiables durante años.

Este artículo consta de dos partes: teórica y práctica. Primero, aprenderás información básica sobre firmas PAdES-LTV. Luego, verás cómo agregar información LTV a firmas PDF en C# usando la biblioteca Docotic.Pdf. Puedes obtener la biblioteca y una clave de licencia gratuita por tiempo limitado en la página Descargar biblioteca PDF para C# .NET.
PAdES - Firmas electrónicas avanzadas de PDF
El Instituto Europeo de Normas de Telecomunicaciones (ETSI) ha publicado varios estándares para firmas electrónicas. En particular, el instituto define el estándar de Firma Electrónica Avanzada de PDF (PAdES) en la especificación ETSI EN 319 142. PAdES describe cómo hacer que las firmas PDF cumplan con las regulaciones europeas eIDAS.
El concepto central de las firmas LTV consiste en incrustar información relacionada con la validación (VRI) en un PDF. Esta información permite validar firmas PDF después de un largo período de tiempo, incluso cuando el entorno de firma ya no está disponible.
La especificación ETSI EN 319 142-1 define cuatro niveles de firmas base de PAdES: B-B, B-T, B-LT y B-LTA. En este artículo, me centraré en los niveles B-LT y B-LTA, ya que se relacionan con firmas habilitadas con LTV en PDF.
PAdES-B-B
Las firmas digitales PDF a corto plazo en el formato ETSI.CAdES.detached corresponden a este nivel. El artículo Firmar documentos PDF en C# y VB.NET explica cómo crear estas firmas.
PAdES-B-T
Las firmas B-T deben cumplir los requisitos del nivel B-B y además incluir un sello de tiempo.
PAdES-B-LT
Las firmas B-LT deben ajustarse al nivel B-T. Además, un archivo PDF debe incluir el diccionario Document Security Store (DSS) con los siguientes datos:
- Todos los certificados de la cadena de confianza
- Respuestas del Online Certificate Status Protocol (OCSP)
- Certificate Revocation Lists (CRLs)
Las Firmas Electrónicas Avanzadas corresponden a este nivel.
PAdES-B-LTA
Las firmas B-LTA deben ajustarse al nivel B-LT. Además, un archivo PDF debe incluir una firma de sello de tiempo del documento y VRI para el certificado del sello de tiempo del documento.
Las Firmas Electrónicas Cualificadas corresponden a este nivel.
PAdES Validation
Una opción es usar Adobe Acrobat Pro o Adobe Reader. Abre el Panel de firmas y despliega una firma digital para comprobar su estado. Si la firma es válida, verás ya sea "La firma tiene LTV habilitado" o "La firma no tiene LTV habilitado y caducará después de".

Otra opción es usar el validador PAdES de la Comisión Europea. Este método funciona mejor al validar documentos compatibles con la UE (eIDAS).
También está el Comprobador de conformidad de firmas de ETSI. Este servicio está diseñado principalmente para desarrolladores que trabajan en herramientas de firma o validación.
Ten en cuenta que estos validadores pueden proporcionar resultados diferentes para el mismo documento PDF.

Crear firmas PDF habilitadas con LTV en C# y VB.NET
¡Es hora de escribir código! Docotic.Pdf proporciona los métodos PdfDocument.AddLtvInfo para agregar información LTV a firmas PDF. Para producir firmas B-LTA, también necesitarás los métodos PdfDocument.TimestampAndSave para guardar PDFs con firmas de sello de tiempo del documento.
Cómo crear firmas PAdES-B-LT en C#
El proceso de creación de firmas B-LT consta de tres pasos:
- Crear una firma B-T y guardar el documento.
- Abrir el documento firmado y agregar información LTV.
- Guardar el documento final de forma incremental.
Aquí está el código C# para crear firmas B-LT. También puedes descargar el proyecto de ejemplo completo Crear firmas PDF compatibles con LTV desde GitHub:
// 1. Crear una firma PAdES-B-T
using var step1 = new MemoryStream();
using (var pdf = new PdfDocument())
{
var options = new PdfSigningOptions(..)
{
DigestAlgorithm = PdfDigestAlgorithm.Sha256,
Format = PdfSignatureFormat.CadesDetached,
};
options.Timestamp.AuthorityUrl = new Uri("http://timestamp.digicert.com");
pdf.SignAndSave(options, step1);
}
// 2. Abrir el documento firmado y agregar información LTV
using (var pdf = new PdfDocument(step1))
{
pdf.AddLtvInfo();
// 3. Guardar el documento final de forma incremental
var incrementalOptions = new PdfSaveOptions()
{
WriteIncrementally = true,
};
pdf.Save("b-lt.pdf", incrementalOptions);
}
Hay algunos puntos clave a considerar. Primero, puedes crear PdfSigningOptions usando un certificado PKCS#12 (.pfx o .p12) o un firmante externo. Independientemente del método, para cumplir con PAdES, la opción Format debe establecerse en PdfSignatureFormat.CadesDetached.
Este fragmento de código usa http://timestamp.digicert.com, pero puedes usar cualquier otra autoridad de sellado de tiempo (TSA). Estas son algunas alternativas populares:
http://timestamp.comodoca.com/rfc3161
http://timestamp.sectigo.com
http://timestamp.entrust.net/TSS/RFC3161sha2TS
http://rfc3161timestamp.globalsign.com/advanced
Para cumplir con las especificaciones de ETSI, debes usar una TSA aprobada por eIDAS. Puedes elegir una usando el Buscador de listas de confianza de la UE/EEE.
Guardar el documento intermedio después del primer paso es obligatorio. Debes firmar y guardar el documento antes de anexar información LTV. Sin embargo, hay una excepción a esta regla, que explico más abajo en la sección Certificar PDF con LTV.
La línea WriteIncrementally = true del tercer paso habilita el guardado incremental. Las actualizaciones incrementales no invalidan las firmas digitales. Siempre debes guardar archivos PDF de forma incremental al agregar información LTV.
Cómo crear firmas PAdES-B-LTA en C#
Generar firmas B-LTA es similar, excepto por el tercer paso. Debes:
- Crear una firma B-T y guardar el documento.
- Abrir el documento firmado y agregar información LTV.
- Guardar el documento final de forma incremental con una firma de sello de tiempo del documento.
Este ejemplo de código muestra cómo crear firmas B-LTA en C#:
var timestampAuthorityUrl = new Uri("http://timestamp.digicert.com");
// 1. Crear una firma PAdES-B-T
using var step1 = new MemoryStream();
using (var pdf = new PdfDocument())
{
var options = new PdfSigningOptions(..)
{
DigestAlgorithm = PdfDigestAlgorithm.Sha256,
Format = PdfSignatureFormat.CadesDetached,
};
options.Timestamp.AuthorityUrl = timestampAuthorityUrl;
pdf.SignAndSave(options, step1);
}
// 2. Abrir el documento firmado y agregar información LTV
using (var pdf = new PdfDocument(step1))
{
pdf.AddLtvInfo();
// 3. Guardar el documento final de forma incremental con una firma de sello de tiempo del documento
var timestampOptions = new PdfSignatureTimestampOptions
{
AuthorityUrl = timestampAuthorityUrl,
};
var incrementalOptions = new PdfSaveOptions()
{
WriteIncrementally = true,
};
pdf.TimestampAndSave(timestampOptions, "b-lta.pdf", incrementalOptions);
}
El documento final b-lta.pdf contiene dos firmas: la firma principal del primer paso y la firma de sello de tiempo del documento del tercer paso. Quizá notes que Adobe Acrobat muestra el mensaje "La firma tiene LTV habilitado" para ambas firmas. ¿Cómo es posible que la firma de sello de tiempo del documento tenga LTV habilitado si se creó después de la llamada a AddLtvInfo?
La clave es usar la misma
TSA
para el sello de tiempo de la firma y para el sello de tiempo del documento. El método AddLtvInfo agrega
VRI
para el certificado del sello de tiempo. Luego, el sello de tiempo del documento usa el mismo certificado y reutiliza los datos asociados.
¿No puedes usar la misma TSA para el sello de tiempo del documento? Revisaré este caso en la sección Conversión de PAdES-B-T a B-LTA.
Agregar información LTV a firmas PDF existentes en C# y VB.NET
Hasta ahora, he creado firmas habilitadas con LTV desde cero. Sin embargo, a menudo es necesario modificar firmas PAdES-B-T existentes. Por ejemplo, para convertirlas a B-LT o B-LTA, o para actualizar la información LTV.
Como en los ejemplos anteriores, necesitas:
- Abrir el documento firmado y agregar información LTV.
- Guardar el documento final de forma incremental, con o sin una firma de sello de tiempo del documento.
Aquí están los fragmentos de código correspondientes.
Cómo convertir firmas PAdES-B-T a B-LT en C#
using var pdf = new PdfDocument("b-t.pdf");
pdf.AddLtvInfo();
var incrementalOptions = new PdfSaveOptions()
{
WriteIncrementally = true,
};
pdf.Save("b-lt.pdf", incrementalOptions);
Cómo convertir firmas PAdES-B-T a B-LTA en C#
using var pdf = new PdfDocument("b-t.pdf");
pdf.AddLtvInfo();
var timestampOptions = new PdfSignatureTimestampOptions
{
AuthorityUrl = new Uri("http://timestamp.digicert.com"),
};
var incrementalOptions = new PdfSaveOptions()
{
WriteIncrementally = true,
};
pdf.TimestampAndSave(timestampOptions, "b-lta.pdf", incrementalOptions);
Descarga el proyecto de ejemplo completo Añadir información LTV a las firmas existentes. en GitHub.
Agregar información LTV a una firma de sello de tiempo del documento
Las firmas B-T existentes podrían usar una TSA arbitraria distinta de la usada en este ejemplo. En tales casos, Adobe Acrobat mostrará el mensaje "La firma no tiene LTV habilitado" para la firma de sello de tiempo del documento.
¿Cómo puedes habilitarla con LTV? Debes agregar información LTV a la firma de sello de tiempo del documento:
var timestampOptions = new PdfSignatureTimestampOptions
{
AuthorityUrl = new Uri("http://timestamp.digicert.com"),
};
var incrementalOptions = new PdfSaveOptions()
{
WriteIncrementally = true,
};
using var intermediate = new MemoryStream();
using (var pdf = new PdfDocument("b-t.pdf"))
{
pdf.AddLtvInfo();
pdf.TimestampAndSave(timestampOptions, intermediate, incrementalOptions);
}
// Agregar información LTV a la firma de sello de tiempo del documento
using (var pdf = new PdfDocument(intermediate))
{
pdf.AddLtvInfo();
pdf.TimestampAndSave(timestampOptions, "b-lta.pdf", incrementalOptions);
}
Certificar PDF con LTV en C# y VB.NET
Las firmas digitales en documentos PDF certificados no permiten ninguna modificación. Las aplicaciones lectoras de PDF muestran estas firmas con un icono especial y un texto que comienza con "Certificado por".

Cualquier cambio en un PDF certificado invalidará la firma, lo que significa que no puedes agregar información LTV sin romper la certificación.
Docotic.Pdf ofrece la capacidad de generar documentos PDF certificados con información LTV. Usa la sobrecarga AddLtvInfo(PdfSigningOptions) para agregar información LTV durante la firma. Este ejemplo de código demuestra cómo certificar PDF con una firma B-LT en C#:
using var pdf = new PdfDocument();
var options = new PdfSigningOptions(..)
{
DigestAlgorithm = PdfDigestAlgorithm.Sha256,
Format = PdfSignatureFormat.CadesDetached,
Type = PdfSignatureType.AuthorNoChanges,
};
options.Timestamp.AuthorityUrl = new Uri("http://timestamp.digicert.com");
pdf.AddLtvInfo(options);
pdf.SignAndSave(options, "certified-b-lt.pdf");
Explora el ejemplo de código Certificar PDF con firmas LTV en GitHub.
A junio de 2025, Adobe Acrobat admite documentos PDF certificados con firmas B-LT, pero considera inválidas las firmas B-LTA en documentos certificados.
Conclusión
Puedes agregar información de Validación a Largo Plazo (LTV) a las firmas PDF para garantizar el cumplimiento legal y la confianza a largo plazo. El estándar PAdES define reglas y niveles de conformidad para las firmas PDF.
Se recomienda firmar al menos con firmas PAdES-B-T. Las firmas B-T pueden convertirse en Firmas Electrónicas Avanzadas (B-LT) o Firmas Electrónicas Cualificadas (B-LTA) sin romper las validaciones existentes.
Usa la biblioteca Docotic.Pdf para agregar información LTV a firmas PDF en aplicaciones .NET. Incluso puedes certificar documentos PDF con LTV.
Explora ejemplos de código para firmas digitales en PDF en GitHub. Consulta artículos relacionados para obtener información adicional:
- Firmar documentos PDF en C# y VB.NET
- Verificar la firma PDF en C# y VB.NET
- Cómo firmar PDFs con tokens USB y dispositivos HSM en C# y VB.NET
Preguntas frecuentes
¿Cómo evito el mensaje "La validez de la firma es desconocida" en Adobe Acrobat?
Adobe Acrobat muestra la advertencia "La validez de la firma es desconocida" cuando no puede verificar el certificado del firmante. Esto suele ocurrir cuando el certificado falta, no es de confianza, está autofirmado, revocado, caducado o aún no está activo.
Obtén el certificado correcto para evitar la advertencia o crea documentos compatibles con la UE (eIDAS).
Como alternativa, puedes agregar manualmente certificados a "Certificados de confianza" en Adobe Acrobat. Esta opción está disponible en: Menú > Preferencias > Firmas > Identidades y certificados de confianza.
Si necesitas confiar en un certificado para documentos certificados, asegúrate de conceder el permiso correspondiente:

¿Cómo compruebo si una firma PDF tiene LTV habilitado?
Puedes usar Adobe Reader o el validador PAdES de la Comisión Europea. Consulta la sección Validación PAdES para más detalles.
¿Por qué Adobe Acrobat muestra "La firma no tiene LTV habilitado"?
Adobe Acrobat comprueba la información de revocación como parte del proceso de validación de la firma. Si necesita descargar algún dato, la firma correspondiente no tiene LTV habilitado.
¿Cómo hago que una firma PDF cumpla con las especificaciones de ETSI?
Sigue los requisitos de las Firmas Electrónicas Avanzadas de PDF. Debes usar certificados emitidos por proveedores incluidos en las Listas de Confianza de la Unión Europea (EUTL).
¿Cómo consigo el indicador "La firma tiene LTV habilitado" en Adobe Reader?
Primero, la firma debe cumplir al menos el nivel PAdES-B-T. Luego, debes agregar información LTV, incluidos todos los certificados de la cadena de confianza, OCSP responses, y CRLs .
Las secciones Crear firma PDF habilitada con LTV y Agregar información LTV a firmas PDF existentes explican cómo agregar información LTV en C# y VB.NET.
¿Cómo habilito LTV para una firma de sello de tiempo del documento?
El proceso es similar al de las firmas PDF normales. Debes agregar información LTV para la firma de sello de tiempo del documento al diccionario DSS
Consulta el ejemplo de código en la sección Agregar información LTV a una firma de sello de tiempo del documento.
¿Es posible realizar LTV y sellado de tiempo en la misma operación?
¡Sí! Consulta el ejemplo de código en la sección Cómo convertir firmas PAdES-B-T a B-LTA.
¿Cómo creo una firma digital con LTV en C#?
Usa la biblioteca Docotic.Pdf. Para producir Firmas Electrónicas Avanzadas, mira los ejemplos de código en la sección Cómo crear firma PAdES-B-LT. Para crear Firmas Electrónicas Cualificadas, consulta la sección Cómo crear firma PAdES-B-LTA.
¿Cómo habilito LTV para una firma cuando "no se permiten cambios"?
Para documentos certificados, Adobe Acrobat requiere que todos los datos LTV se incluyan en el documento firmado original. Lee la sección Certificar PDF con LTV para más detalles.
¿Cómo habilito la Validación a Largo Plazo (LTV) al firmar documentos PDF externamente?
Usa la biblioteca Docotic.Pdf para firmar documentos PDF con LTV usando tokens USB, tarjetas inteligentes o HSM basados en la nube. Consulta el artículo Cómo firmar PDFs con tokens USB y dispositivos HSM en C# y VB.NET y la sección Cómo crear firma PAdES-B-LT.
¿Cómo firmo un PDF con varias firmas y habilito LTV?
Combina los ejemplos de código Firmar un formulario PDF por varias personas y Añadir información LTV a las firmas existentes..