Метки времени подписания в Windows

Операция подписания Windows может запросить подлинную метку времени RFC3161 через синхронный колбэк приложения и опубликовать PDF только после аутентификации ответа

Опции подписания

{"schemaVersion":1,"type":"sign","incremental":true,
 "existingField":true,"fieldName":"ApprovalOne",
 "pfxFile":"C:/keys/signer.pfx","pfxPassword":"password",
 "cades":true,"digestMethod":"SHA384","timestamp":true,
 "timestampURL":"https://tsa.example/service",
 "timestampTrustedCAFile":"C:/trust/tsa-roots.pem",
 "timestampTrustedCRLFile":"C:/trust/tsa-crls.pem",
 "requireTimestampRevocation":true}

timestamp по умолчанию false; значение true требует транспортный колбэк приложения и явный timestampTrustedCAFile с доверенными PEM-корнями сертификатов

digestMethod выбирает фактический digest CMS документа и алгоритм imprint метки времени из SHA256, SHA384 или SHA512; messageImprint хеширует фактические октеты подписи CMS ровно один раз

timestampTrustedCRLFile необязательно поставляет PEM CRL; requireTimestampRevocation требует этот файл и включает проверки CRL issuer и сертификата, включая отозванные сертификаты и истёкшие доказательства

Файлы ввода доверия остаются открытыми с запретом совместной записи во время подписания, а их суммарный размер ограничен одной восьмой memoryBytes до загрузки OpenSSL

Каждый запрос содержит свежую криптографическую nonce и запрашивает сертификаты TSA; валидация ответа аутентифицирует nonce запроса, imprint, полную подпись CMS, привязку сертификата подписанта ESS, цепочку сертификатов и критичный EKU метки времени

Транспорт C ABI

Передайте hpdf_signing_operation_v1 в hpdf_document_execute_json_v1, установите operation.struct_size в sizeof(hpdf_signing_operation_v1) и предоставьте timestamp_transport и timestamp_user_data

Префикс операции сохраняет существующую раскладку и версию ABI hpdf_operation_v1; обычные операции продолжают использовать исходную структуру

Колбэк получает полный DER TimeStampReq и заимствованный response_io; запишите полный DER TimeStampResp через response_io.write и верните hpdf_status

Колбэк выполняется на вызывающем потоке, а указатели IO запроса и ответа действительны только во время этого вызова; сетевым транспортом, аутентификацией, таймаутами и политикой соединений владеет приложение

response_io.is_cancelled опрашивает колбэки отмены ввода, вывода и результата операции; записи ответа соблюдают максимум 16 МиБ, дополнительно ограниченный одной восьмой memoryBytes, перед копированием памяти колбэка

Сбой записи ответа или отмены остаётся активным для операции, даже если колбэк затем вернул успех; неудавшиеся ответы не могут опубликовать байты PDF

Pascal-точка входа сервиса

THPDFJobProcessor.ExecuteLoadedSigningOperation принимает загруженный документ, JSON-объект операции, выходной поток, контрольную точку, колбэк THPDFHeadlessTimestampTransport и непрозрачный контекст колбэка

Pascal-транспорт получает DER запроса и возвращает DER ответа; вложенное синхронное подписание восстанавливает контекст объемлющего колбэка при возврате внутренней операции

Seed-значения и провенанс

Обязательное ограничение SV TimeStamp удовлетворяется фактическим аутентифицированным ответом; когда обязательный словарь TimeStamp указывает URL, timestampURL обязан совпадать с этим значением

timestampURL — заявленный приложением провенанс транспорта; сравнение объявленного URL не устанавливает идентичность HTTPS-сервера, и приложение обязано аутентифицировать выбранный эндпоинт

Автономные файловые задания без колбэка приложения не могут выполнить запрос метки времени; одна лишь строка URL не может удовлетворить обязательную метку времени

См. задания инкрементального подписания PFX и нативную проверку RFC3161