Эта страница может содержать автоматически переведенный текст.
Добавить информацию о долгосрочной проверке (PAdES-LTV) в подписи PDF в C# и VB.NET
Информация о долгосрочной проверке (LTV) для подписей PDF помогает проверять цифровые подписи долгое время после их создания. Без LTV цифровая подпись становится непроверяемой после истечения срока действия сертификата подписчика или отсутствия данных об отзыве. Это часто неприемлемо для юридических и финансовых документов PDF, которые должны оставаться надежными в течение многих лет.
Эта статья состоит из двух частей: теоретической и практической. Сначала вы узнаете базовую информацию о подписях PAdES-LTV. Затем вы узнаете, как добавлять информацию LTV в подписи PDF в C# с помощью библиотеки Docotic.Pdf. Вы можете получить библиотеку и бесплатный ключ с ограниченным сроком действия на странице Скачать PDF библиотеку C# .NET.
9.7.18373 15,244 прошло Всего загрузок NuGet 5,976,723PAdES — Расширенные электронные подписи PDF
Европейский институт стандартов в области телекоммуникаций (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, поскольку они относятся к подписям с поддержкой LTV в PDF.
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 должен включать словарь хранилища безопасности документа (DSS) со следующими данными:
- Все сертификаты в цепочке доверия
- Ответы протокола состояния сетевого сертификата (OCSP)
- Списки отзыва сертификатов (CRL)
Расширенные электронные подписи соответствуют этому уровню.
PAdES-B-LTA
Подписи B-LTA должны соответствовать уровню B-LT. Кроме того, файл PDF должен включать подпись временной метки документа и VRI для сертификата временной метки документа.
Квалифицированные электронные подписи соответствуют этому уровню.
Проверка PAdES
Один из вариантов — использовать Adobe Acrobat Pro или Adobe Reader. Откройте панель подписей и разверните цифровую подпись, чтобы проверить её статус. Если подпись действительна, вы увидите одно из следующих сообщений: «Подпись поддерживает LTV» или «Подпись не поддерживает LTV и утратит действительность после…».
Другой вариант — воспользоваться валидатором PAdES Европейской комиссии. Этот способ особенно эффективен для проверки документов, соответствующих стандарту ЕС (eIDAS).
Также существует инструмент проверки соответствия подписей от 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, следует использовать одобренную eIDAS TSA. Вы можете выбрать подходящую с помощью 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 отображают такие подписи с особым значком и надписью, начинающейся с «Сертифицировано».
Любые изменения в сертифицированном 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 в таких документах.
Заключение
Вы можете добавлять информацию LTV в подписи PDF, чтобы гарантировать юридическую силу и долгосрочное доверие. Стандарт PAdES определяет уровни соответствия и правила для PDF подписей.
Рекомендуется использовать подписи как минимум уровня PAdES-B-T. Такие подписи можно преобразовать в продвинутые (B-LT) или квалифицированные электронные подписи (B-LTA) без потери действительности.
Используйте библиотеку Docotic.Pdf, чтобы добавлять 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 отображает это сообщение, когда не может проверить сертификат подписчика. Обычно это происходит, когда сертификат отсутствует, не является доверенным, самоподписан, отозван, просрочен или еще не активен.
Получите подходящий сертификат, чтобы избежать предупреждений или создавать документы, соответствующие стандарту EU (eIDAS).
В качестве альтернативы вы можете вручную добавить сертификаты в «Доверенные сертификаты» в Adobe
Acrobat: Меню > Настройки > Подписи > Идентификаторы и доверенные сертификаты
.
Если необходимо доверять сертификату в сертифицированных документах, убедитесь, что предоставлены соответствующие разрешения:
Как проверить, поддерживает ли подпись LTV?
Используйте Adobe Reader или валидатор PAdES Европейской комиссии. Подробнее в разделе Проверка PAdES.
Почему Acrobat сообщает, что «Подпись не поддерживает LTV»?
Adobe Acrobat проверяет информацию об отзыве сертификатов при валидации подписи. Если для этого нужно загрузить данные, подпись считается не поддерживающей LTV.
Как обеспечить соответствие подписи спецификациям ETSI?
Следуйте требованиям Продвинутых электронных подписей PDF. Используйте сертификаты, выданные поставщиками из Списков доверия ЕС (EUTL).
Как добиться статуса «Подпись поддерживает LTV» в Adobe Reader?
Сначала подпись должна соответствовать как минимум уровню PAdES-B-T. Затем добавьте LTV-информацию: полную цепочку сертификатов, ответы OCSP и CRLs .
Подробности см. в разделах Создание LTV-поддерживаемой подписи PDF и Добавление LTV в существующие подписи PDF для C# и VB.NET.
Как включить LTV для штампа времени в документе?
Процесс аналогичен обычным подписям PDF. Добавьте LTV-информацию в словарь DSS для штампа времени документа.
См. пример в разделе Добавление LTV к подписи штампа времени документа.
Можно ли одновременно подписать с LTV и штампом времени?
Да! Изучите пример из раздела Как преобразовать подписи PAdES-B-T в B-LTA.
Как создать цифровую подпись с LTV на C#?
Используйте библиотеку Docotic.Pdf. Для создания расширенных электронных подписей ознакомьтесь с примерами кода в разделе Как создать подпись PAdES-B-LT. Для создания квалифицированных электронных подписей ознакомьтесь с разделом Как создать подпись PAdES-B-LTA.
Как включить LTV, если «изменения запрещены»?
В сертифицированных документах Adobe Acrobat требует, чтобы все данные LTV были включены в изначально подписанный файл. Подробнее в разделе Сертификация PDF с LTV.
Как включить LTV при внешнем подписании PDF документов?
Используйте Docotic.Pdf для подписания PDF с поддержкой LTV через USB-токены, смарт-карты или облачные HSM. Подробнее в статье Как подписывать PDF файлы с помощью USB-токенов и устройств HSM в C# и VB.NET и разделе Как создать подпись PAdES-B-LT.
Как подписать PDF с несколькими подписями и включить LTV?
Совместите примеры Подписание PDF-формы несколькими людьми и Добавляйте информацию LTV к существующим подписям.