Эта страница может содержать автоматически переведенный текст.
Добавление сведений Long-Term Validation (PAdES-LTV) в подписи PDF в C# и VB.NET
Сведения Long-Term Validation (LTV) для подписей PDF помогают проверять цифровые подписи спустя долгое время после их создания. Без LTV цифровая подпись становится непроверяемой, когда срок действия сертификата подписавшего истекает или данные об отзыве становятся недоступны. Для юридических и финансовых PDF-документов, которым нужно оставаться надежными годами, это часто неприемлемо.

Эта статья состоит из двух частей: теоретической и практической. Сначала вы узнаете базовые сведения о подписях PAdES-LTV. Затем вы рассмотрите, как добавить сведения LTV в подписи PDF в C# с помощью Docotic.Pdf library. Получить библиотеку и бесплатный ключ лицензии с ограниченным сроком действия можно на странице Скачать C# .NET библиотеку PDF.
PAdES - PDF Advanced Electronic Signatures
Европейский институт телекоммуникационных стандартов (ETSI) опубликовал несколько стандартов для электронных подписей. В частности, институт определяет стандарт PDF Advanced Electronic Signature (PAdES) в спецификации ETSI EN 319 142. PAdES описывает, как сделать подписи PDF соответствующими европейским требованиям eIDAS.
Ключевая идея подписей LTV — встраивание сведений, связанных с проверкой (VRI), в PDF. Эти сведения позволяют проверять подписи PDF спустя длительное время, даже если среда подписания уже недоступна.
Спецификация ETSI EN 319 142-1 определяет четыре уровня базовых подписей PAdES: B-B, B-T, B-LT и B-LTA. В этой статье я сосредоточусь на уровнях B-LT и B-LTA, поскольку они относятся к подписям PDF с включенным LTV.
PAdES-B-B
Краткосрочные цифровые подписи PDF в формате ETSI.CAdES.detached соответствуют этому уровню. В статье Подписание PDF-документов в C# и VB.NET объясняется, как создавать такие подписи.
PAdES-B-T
Подписи B-T должны соответствовать требованиям уровня B-B и также включать метку времени.
PAdES-B-LT
Подписи B-LT должны соответствовать уровню B-T. Кроме того, PDF-файл должен включать словарь Document Security Store (DSS) со следующими данными:
- Все сертификаты в цепочке доверия
- Ответы Online Certificate Status Protocol (OCSP)
- Списки отзыва сертификатов (CRLs)
Этому уровню соответствуют Advanced Electronic Signatures.
PAdES-B-LTA
Подписи B-LTA должны соответствовать уровню B-LT. Кроме того, PDF-файл должен включать подпись временной метки документа и VRI для сертификата временной метки документа.
Этому уровню соответствуют Qualified Electronic Signatures.
Проверка PAdES
Один из вариантов — использовать Adobe Acrobat Pro или Adobe Reader. Откройте панель подписей и разверните цифровую подпись, чтобы проверить ее статус. Если подпись действительна, вы увидите либо «Подпись поддерживает LTV», либо «Подпись не поддерживает LTV и истечет после».

Другой вариант — использовать валидатор PAdES от Европейской комиссии. Этот способ лучше всего подходит для проверки документов, соответствующих требованиям ЕС (eIDAS).
Есть также Signatures Conformance Checker от ETSI. Этот сервис в первую очередь предназначен для разработчиков, которые работают над инструментами подписания или проверки.
Имейте в виду, что эти валидаторы могут давать разные результаты для одного и того же PDF-документа.

Создание PDF-подписей с включенным LTV в C# и VB.NET
Пора писать код! Docotic.Pdf предоставляет методы PdfDocument.AddLtvInfo для добавления сведений LTV в подписи PDF. Чтобы создавать подписи B-LTA, также понадобятся методы PdfDocument.TimestampAndSave для сохранения PDF с подписями временной метки документа.
Как создать подписи PAdES-B-LT в C#
Процесс создания подписей B-LT состоит из трех шагов:
- Создайте подпись B-T и сохраните документ.
- Откройте подписанный документ и добавьте сведения LTV.
- Сохраните итоговый документ инкрементально.
Ниже приведен код C# для создания подписей B-LT. Полный пример проекта Создавайте PDF подписи с поддержкой LTV можно также скачать из GitHub:
// 1. Создайте подпись 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. Откройте подписанный документ и добавьте сведения LTV
using (var pdf = new PdfDocument(step1))
{
pdf.AddLtvInfo();
// 3. Сохраните итоговый документ инкрементально
var incrementalOptions = new PdfSaveOptions()
{
WriteIncrementally = true,
};
pdf.Save("b-lt.pdf", incrementalOptions);
}
Есть несколько ключевых моментов, которые стоит учитывать. Во-первых, вы можете создавать PdfSigningOptions с помощью сертификата PKCS#12 (.pfx или .p12 файл) или внешнего подписанта. Независимо от способа, для соответствия PAdES параметр Format должен быть установлен в PdfSignatureFormat.CadesDetached.
В этом фрагменте кода используется http://timestamp.digicert.com, но вы можете использовать любой другой центр отметок времени (TSA). Вот несколько популярных альтернатив:
http://timestamp.comodoca.com/rfc3161
http://timestamp.sectigo.com
http://timestamp.entrust.net/TSS/RFC3161sha2TS
http://rfc3161timestamp.globalsign.com/advanced
Чтобы соответствовать спецификациям ETSI, следует использовать TSA, одобренный eIDAS. Вы можете выбрать один из них с помощью EU/EEA Trusted List Browser.
Сохранение промежуточного документа после первого шага обязательно. Сначала нужно подписать и сохранить документ, а затем добавлять сведения LTV. Однако есть одно исключение из этого правила, которое я объясняю ниже, в разделе Сертификация PDF с LTV.
Строка WriteIncrementally = true на третьем шаге включает инкрементальное сохранение. Инкрементальные обновления не делают цифровые подписи недействительными. При добавлении сведений LTV всегда следует сохранять PDF-файлы инкрементально.
Как создать подписи PAdES-B-LTA в C#
Создание подписей B-LTA похоже на предыдущий сценарий, за исключением третьего шага. Нужно:
- Создать подпись B-T и сохранить документ.
- Открыть подписанный документ и добавить сведения LTV.
- Сохранить итоговый документ инкрементально с подписью временной метки документа.
Этот пример кода показывает, как создавать подписи B-LTA в C#:
var timestampAuthorityUrl = new Uri("http://timestamp.digicert.com");
// 1. Создайте подпись 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. Откройте подписанный документ и добавьте сведения LTV
using (var pdf = new PdfDocument(step1))
{
pdf.AddLtvInfo();
// 3. Сохраните итоговый документ инкрементально с подписью временной метки документа
var timestampOptions = new PdfSignatureTimestampOptions
{
AuthorityUrl = timestampAuthorityUrl,
};
var incrementalOptions = new PdfSaveOptions()
{
WriteIncrementally = true,
};
pdf.TimestampAndSave(timestampOptions, "b-lta.pdf", incrementalOptions);
}
Итоговый документ b-lta.pdf содержит две подписи — основную подпись из первого шага и подпись временной метки документа из третьего шага. Можно заметить, что Adobe Acrobat отображает сообщение «Подпись поддерживает LTV» для обеих подписей. Как так получается, что подпись временной метки документа поддерживает LTV, хотя она была создана после вызова AddLtvInfo?
Ключ в том, чтобы использовать один и тот же
TSA
для подписи временной метки и временной метки документа. Метод AddLtvInfo добавляет
VRI
для сертификата временной метки. Затем подпись временной метки документа использует тот же сертификат и повторно применяет связанные данные.
Нельзя использовать один и тот же TSA для временной метки документа? Я рассмотрю этот случай в разделе Преобразование PAdES-B-T в B-LTA.
Добавление сведений LTV к существующим подписям PDF в C# и VB.NET
До этого момента я создавал подписи с включенным LTV с нуля. Однако часто требуется изменить существующие подписи PAdES-B-T. Например, чтобы преобразовать их в B-LT или B-LTA либо обновить сведения LTV.
Как и в предыдущих примерах, нужно:
- Открыть подписанный документ и добавить сведения LTV.
- Сохранить итоговый документ инкрементально, с подписью временной метки документа или без нее.
Ниже приведены соответствующие фрагменты кода.
Как преобразовать подписи PAdES-B-T в B-LT в C#
using var pdf = new PdfDocument("b-t.pdf");
pdf.AddLtvInfo();
var incrementalOptions = new PdfSaveOptions()
{
WriteIncrementally = true,
};
pdf.Save("b-lt.pdf", incrementalOptions);
Как преобразовать подписи PAdES-B-T в B-LTA в 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);
Полный пример проекта Добавляйте информацию LTV к существующим подписям можно скачать из GitHub.
Добавление сведений LTV к подписи временной метки документа
Существующие подписи B-T могут использовать произвольный TSA , отличный от того, что используется в этом примере. В таких случаях Adobe Acrobat будет показывать для подписи временной метки документа сообщение «Подпись не поддерживает LTV».
Как сделать ее поддерживающей LTV? Нужно добавить сведения LTV к подписи временной метки документа:
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);
}
// Добавьте сведения LTV в подпись временной метки документа
using (var pdf = new PdfDocument(intermediate))
{
pdf.AddLtvInfo();
pdf.TimestampAndSave(timestampOptions, "b-lta.pdf", incrementalOptions);
}
Сертификация PDF с LTV в C# и VB.NET
Цифровые подписи в сертифицированных PDF-документах не допускают никаких изменений. Приложения для чтения PDF отображают такие подписи со специальным значком и подписью, начинающейся с «Certified by».

Любые изменения в сертифицированном PDF сделают подпись недействительной, то есть добавить сведения LTV, не нарушив сертификацию, нельзя.
Docotic.Pdf позволяет создавать сертифицированные PDF-документы со сведениями LTV. Используйте перегрузку AddLtvInfo(PdfSigningOptions) для добавления сведений LTV во время подписания. Этот пример кода показывает, как сертифицировать PDF с подписью B-LT в 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");
Изучите пример кода Сертифицируйте PDF с помощью подписей LTV на GitHub.
По состоянию на июнь 2025 года Adobe Acrobat поддерживает сертифицированные PDF-документы с подписями B-LT, но считает подписи B-LTA в сертифицированных документах недействительными.
Заключение
Вы можете добавлять сведения Long-Term Validation (LTV) в подписи PDF, чтобы гарантировать соответствие требованиям законодательства и долгосрочное доверие. Стандарт PAdES определяет правила и уровни соответствия для подписей PDF.
Рекомендуется подписывать документы как минимум подписями PAdES-B-T. Подписи B-T можно преобразовать в Advanced Electronic Signatures (B-LT) или Qualified Electronic Signatures (B-LTA) без нарушения существующих проверок.
Используйте Docotic.Pdf library для добавления сведений LTV в подписи PDF в .NET-приложениях. Вы даже можете сертифицировать PDF-документы с LTV.
Изучите примеры кода цифровых подписей в PDF на GitHub. Смотрите связанные статьи для дополнительной информации:
- Подписание PDF-документов в C# и VB.NET
- Проверка подписи PDF в C# и VB.NET
- Как подписывать PDF-файлы с USB-токенами и устройствами HSM в C# и VB.NET
Часто задаваемые вопросы
Как избежать сообщения «достоверность подписи неизвестна» в Adobe Acrobat?
Adobe Acrobat отображает предупреждение «достоверность подписи неизвестна», когда не может проверить сертификат подписавшего. Обычно это происходит, если сертификат отсутствует, не доверен, самоподписан, отозван, просрочен или еще не активен.
Получите правильный сертификат, чтобы избежать предупреждения, или создайте документы, соответствующие требованиям ЕС (eIDAS).
Кроме того, вы можете вручную добавить сертификаты в «Trusted Certificates» в Adobe Acrobat. Этот параметр доступен по пути: Menu > Preferences > Signatures > Identities & Trusted Certificates.
Если вам нужно доверять сертификату для сертифицированных документов, обязательно предоставьте соответствующее разрешение:

Как проверить, поддерживает ли подпись PDF LTV?
Вы можете использовать Adobe Reader или валидатор PAdES от Европейской комиссии. Подробности см. в разделе Проверка PAdES.
Почему Adobe Acrobat отображает сообщение «Подпись не поддерживает LTV»?
Adobe Acrobat проверяет сведения об отзыве в рамках процесса проверки подписи. Если ему нужно загрузить какие-либо данные, соответствующая подпись не поддерживает LTV.
Как сделать подпись PDF соответствующей спецификациям ETSI?
Следуйте требованиям для PDF Advanced Electronic Signatures. Нужно использовать сертификаты, выданные провайдерами, перечисленными в European Union Trusted Lists (EUTL).
Как получить индикатор «Подпись поддерживает LTV» в Adobe Reader?
Сначала подпись должна соответствовать как минимум уровню PAdES-B-T. Затем нужно добавить сведения LTV, включая все сертификаты в цепочке доверия, OCSP ответы и CRLs .
Разделы Создание PDF-подписи с включенным LTV и Добавление сведений LTV к существующим подписям PDF объясняют, как добавлять сведения LTV в C# и VB.NET.
Как включить LTV для подписи временной метки документа?
Процесс похож на обычные подписи PDF. Нужно добавить сведения LTV для подписи временной метки документа в словарь DSS .
См. пример кода в разделе Добавление сведений LTV к подписи временной метки документа.
Можно ли выполнять LTV и timestamping в одной операции?
Да! Смотрите пример кода в разделе Как преобразовать подписи PAdES-B-T в B-LTA.
Как создать цифровую подпись с LTV в C#?
Используйте Docotic.Pdf library. Чтобы создавать Advanced Electronic Signatures, смотрите примеры кода в разделе Как создать подпись PAdES-B-LT. Чтобы создавать Qualified Electronic Signatures, смотрите раздел Как создать подпись PAdES-B-LTA.
Как включить LTV для подписи, если «изменения не допускаются»?
Для сертифицированных документов Adobe Acrobat требует, чтобы все данные LTV были включены в исходный подписанный документ. Подробности см. в разделе Сертификация PDF с LTV.
Как включить Long-Term Validation (LTV) при внешнем подписании PDF-документов?
Используйте Docotic.Pdf library для подписания PDF-документов с LTV с помощью USB-токенов, смарт-карт или облачных HSM. См. статью Как подписывать PDF-файлы с USB-токенами и устройствами HSM в C# и VB.NET и раздел Как создать подпись PAdES-B-LT.
Как подписать PDF несколькими подписями и включить LTV?
Объедините примеры кода Подписание PDF-формы несколькими людьми и Добавляйте информацию LTV к существующим подписям.