Esta página puede contener texto traducido automáticamente.

Agregar información de Validación a Largo Plazo (PAdES-LTV) a firmas 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 se vuelve inverificable 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, explorará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 la biblioteca PDF de C# .NET.

Biblioteca Docotic.Pdf 9.7.18373 Pruebas de regresión 15,244 pasaron Descargas totales de NuGet 5,976,723

Validación a Largo Plazo (LTV)

PAdES – Firmas Electrónicas Avanzadas para PDF

El Instituto Europeo de Normas de Telecomunicaciones (ETSI) ha publicado varios estándares para firmas electrónicas. En particular, define el estándar de Firma Electrónica Avanzada para PDF (PAdES) en la especificación ETSI EN 319 142. PAdES describe cómo hacer firmas PDF compatibles con la regulación eIDAS europea.

El concepto central de las firmas con LTV implica incrustar información de validación (VRI) en un PDF. Esta información permite validar firmas PDF después de un largo período, incluso cuando el entorno de firma ya no está disponible.

La especificación ETSI EN 319 142-1 define cuatro niveles de firmas base 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 están relacionados con firmas PDF con soporte para LTV.

PAdES-B-B

Las firmas digitales PDF de corta duración en el formato ETSI.CAdES.sided corresponden a este nivel. El artículo Firmar documentos PDF en C# y VB.NET explica cómo crear dichas firmas.

PAdES-B-T

Las firmas B-T deben cumplir con los requisitos del nivel B-B y además incluir una marca de tiempo.

PAdES-B-LT

Las firmas B-LT deben ajustarse al nivel B-T. Además, el archivo PDF debe incluir el diccionario Document Security Store (DSS) con los siguientes datos:

  • Todos los certificados de la cadena de confianza
  • Respuestas del Protocolo de Verificación de Certificados en Línea (OCSP)
  • Listas de revocación de certificados (CRL)

Las Firmas Electrónicas Avanzadas corresponden a este nivel.

PAdES-B-LTA

Las firmas B-LTA deben cumplir con el nivel B-LT. Además, el archivo PDF debe incluir una firma de marca de tiempo del documento y VRI para el certificado de marca de tiempo del documento.

Las Firmas Electrónicas Cualificadas corresponden a este nivel.

Validación de PAdES

Una opción es usar Adobe Acrobat Pro o Adobe Reader. Abre el Panel de Firmas y expande una firma digital para verificar su estado. Si la firma es válida, verás "La firma tiene LTV habilitado" o "La firma no tiene LTV habilitado y expirará después".

Firma con LTV habilitado en Adobe Reader

Otra opción es usar el validador PAdES de la Comisión Europea. Este método es ideal para documentos conformes con eIDAS.

También existe el Verificador de Conformidad de Firmas de ETSI, dirigido principalmente a desarrolladores de herramientas de firma y validación.

Ten en cuenta que estos validadores pueden ofrecer resultados distintos para el mismo documento PDF.

Hablar es barato. Muéstrame el código.

Crear firmas PDF 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 generar firmas B-LTA, también necesitarás los métodos PdfDocument.TimestampAndSave para guardar archivos PDF con firmas de marca de tiempo del documento.

Cómo crear firmas PAdES-B-LT en C#

El proceso para crear firmas B-LT consta de tres pasos:

  1. Crear una firma B-T y guardar el documento.
  2. Abrir el documento firmado y agregar información LTV.
  3. Guardar el documento final de forma incremental.

Aquí tienes el código en C# para crear firmas B-LT. También puedes descargar el proyecto completo de ejemplo 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, puede crear PdfSigningOptions usando un certificado PKCS#12 (archivo .pfx o .p12) o un firmante externo. Independientemente del método, para la conformidad con PAdES, la opción Format debe estar configurada como PdfSignatureFormat.CadesDetached.

Este fragmento de código usa http://timestamp.digicert.com, pero puede usar cualquier otra autoridad de sellado de tiempo (TSA). Aquí tiene 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 del ETSI, debe utilizar una TSA aprobada por eIDAS. Puede elegir una mediante el Explorador de Listas de Confianza de la UE/EEE.

Es obligatorio guardar el documento intermedio después del primer paso. Debe firmar y guardar el documento antes de añadir la información LTV. Sin embargo, hay una excepción a esta regla, que explico más adelante en la sección Certificar PDF con LTV.

La línea WriteIncrementally = true del paso tres permite el guardado incremental. Las actualizaciones incrementales no invalidan las firmas digitales. Siempre debe guardar los archivos PDF de forma incremental al añadir información LTV.

Cómo crear firmas PAdES-B-LTA en C#

Generating B-LTA signatures is similar, except for step three. You should:

  1. Crear una firma B-T y guardar el documento.
  2. Abrir el documento firmado y agregar información LTV.
  3. Guardar el documento final de forma incremental con una firma de marca 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 marca 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 paso uno y la firma de marca de tiempo del documento del paso tres. Es posible que Adobe Acrobat muestre el mensaje "La firma está habilitada para LTV" para ambas firmas. ¿Cómo es posible que la firma de marca de tiempo del documento esté habilitada para LTV a pesar de haberse creado después de la llamada AddLtvInfo?

La clave es usar la misma TSA para la marca de tiempo de la firma y la del documento. El método AddLtvInfo agrega VRI para el certificado de marca de tiempo. La marca de tiempo del documento utiliza el mismo certificado y reutiliza los datos asociados.

¿No puedes usar la misma TSA para la marca de tiempo del documento? Revisaré este caso en la sección Conversión de PAdES-B-T a B-LTA.

Añadir información LTV a firmas PDF existentes en C# y VB.NET

Hasta ahora, he creado firmas compatibles con LTV desde cero. Sin embargo, a menudo es necesario modificar las firmas PAdES-B-T existentes. Por ejemplo, para convertirlas a B-LT o B-LTA, o para actualizar la información LTV.

Al igual que en los ejemplos anteriores, necesita:

  1. Abrir el documento firmado y agregar información LTV.
  2. Guardar el documento final de forma incremental, con o sin firma de marca 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.

Añadir información LTV a la firma de marca de tiempo de un documento

Las firmas B-T existentes podrían usar una TSA arbitraria diferente a la utilizada en este ejemplo. En tales casos, Adobe Acrobat mostrará el mensaje "La firma no está habilitada para LTV" para la firma de marca de tiempo del documento.

¿Cómo puedes habilitar LTV? Debes agregar información LTV a la firma de marca 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);
}

// Añadir información LTV a la firma de marca 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 modificaciones. Los lectores de PDF muestran estas firmas con un icono especial y una leyenda que comienza con "Certificado por".

Firma de PDF certificada mostrada en Adobe Acrobat

Cualquier cambio en un PDF certificado invalidará la firma, lo que significa que no se puede agregar información LTV sin romper la certificación.

Docotic.Pdf permite generar documentos PDF certificados con información LTV. Utilice la sobrecarga AddLtvInfo(PdfSigningOptions) para agregar información LTV durante la firma. Este ejemplo de código muestra cómo certificar un 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");

Explore el ejemplo de código Certificar PDF con firmas LTV en GitHub.

Starting in June 2025, Adobe Acrobat supports certified PDF documents with B-LT signatures, but considers B-LTA signatures invalid on certified documents.

Conclusión

Puede 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 las reglas y los niveles de conformidad para las firmas PDF.

Se recomienda firmar con al menos firmas PAdES-B-T. Las firmas B-T se pueden convertir a Firmas Electrónicas Avanzadas (B-LT) o Firmas Electrónicas Cualificadas (B-LTA) sin romper las validaciones existentes.

Utilice la biblioteca Docotic.Pdf para agregar información LTV a las firmas PDF en aplicaciones .NET. Incluso puede certificar documentos PDF con LTV.

Explora ejemplos de código para firmas digitales en PDF en GitHub. Consulta artículos relacionados para obtener más información:

Preguntas frecuentes

¿Cómo puedo evitar el mensaje "Validez de la firma desconocida" en Adobe Acrobat?

Adobe Acrobat muestra la advertencia "Validez de la firma desconocida" cuando no puede verificar el certificado del firmante. Esto suele ocurrir cuando el certificado falta, no es de confianza, está autofirmado, está revocado, ha caducado o aún no está activo.

Obtener el certificado correcto para evitar la advertencia o crear documentos que cumplan con la normativa eIDAS de la UE.

También puede agregar certificados manualmente a "Certificados de confianza" en Adobe Acrobat. Esta opción está disponible en: Menú > Preferencias > Firmas > Identidades y certificados de confianza.

Si necesita confiar en un certificado para documentos certificados, asegúrese de otorgar el permiso correspondiente:

Configuración de la confianza en Adobe Acrobat

¿Cómo puedo comprobar si una firma PDF tiene LTV habilitado?

Puede usar Adobe Reader o el validador PAdES de la Comisión Europea. Consulte la sección Validación PAdES para obtener más información.

¿Por qué Adobe Acrobat muestra el mensaje "La firma no está habilitada para LTV"?

Adobe Acrobat comprueba la información de revocación como parte del proceso de validación de firmas. Si necesita descargar datos, la firma correspondiente no está habilitada para LTV.

¿Cómo puedo lograr que una firma PDF cumpla con las especificaciones ETSI?

Siga los requisitos de Firmas electrónicas avanzadas PDF. Debe utilizar certificados emitidos por proveedores incluidos en las Listas de confianza de la Unión Europea (EUTL).

¿Cómo consigo el indicador "La firma está habilitada para LTV" en Adobe Reader?

Primero, la firma debe cumplir al menos el nivel PAdES-B-T. Luego, debe agregar la información de LTV, incluyendo todos los certificados en la cadena de confianza, las respuestas de OCSP y las CRLs .

Las secciones Crear una firma PDF habilitada para LTV y Agregar información de LTV a las firmas PDF existentes explican cómo agregar información de LTV en C# y VB.NET.

¿Cómo habilito LTV para una firma de marca de tiempo del documento?

El proceso es similar al de las firmas PDF normales. Debe agregar la información del LTV para la firma con marca de tiempo de documento al diccionario DSS .

Consulte el ejemplo de código en la sección Agregar información del LTV a una firma con marca de tiempo de documento.

¿Es posible realizar el LTV y el sellado de tiempo en la misma operación?

¡Sí! Consulte 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#?

Use la biblioteca Docotic.Pdf. Para generar firmas electrónicas avanzadas, consulte los ejemplos de código en la sección Cómo crear una firma PAdES-B-LT. Para crear firmas electrónicas cualificadas, consulte la sección Cómo crear una firma PAdES-B-LTA.

¿Cómo activo el 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 original firmado. Consulte la sección Certificar PDF con LTV para obtener más información.

¿Cómo activo la Validación a Largo Plazo (LTV) al firmar documentos PDF externamente?

Utilice la biblioteca Docotic.Pdf para firmar documentos PDF con LTV mediante tokens USB, tarjetas inteligentes o HSM en la nube. Consulte el artículo Cómo firmar PDF con tokens USB y dispositivos HSM en C# y VB.NET y la sección Cómo crear una firma PAdES-B-LT.

¿Cómo firmo un PDF con varias firmas y activo la LTV?

Combine los ejemplos de código Firmar un formulario PDF por varias personas y Añadir información LTV a las firmas existentes..