Перейти к содержимому

Tsp srf что это

  • автор:

Установка штампа времени при подписании документов

Для подтверждения точного времени подписания документа используется специальный штамп. Это один из механизмов формирования улучшенной (усовершенствованной) подписи. Он создается на основании запросов в Службу штампов времени (TSP-сервис).

Также отправляется запрос в OCSP-сервис, чтобы подтвердить статус сертификата на момент подписания.

В СБИС

Штамп времени в СБИС устанавливается в документе автоматически при использовании любой электронной подписи. Его данные отображаются в штампе об электронной подписи в печатной форме документа.

Печать даты подписания на штампе ЭП — дополнительная функция, которую можно отключить в настройках.

В других системах

При создании улучшенной подписи в других системах (например, КриптоАРМ Стандарт ПЛЮС) может потребоваться настройка — указание адресов серверов.

Для подписи, выданной удостоверяющим центром «Тензор»:

  • TSP-сервис — http://tax4.tensor.ru/tsp-tensor_gost2012/tsp.srf.
  • OCSP-сервис — содержится в самой ЭП. Откройте сертификат на вкладке «Состав» и в списке выберите «Доступ к информации о центре сертификации».

В некотором ПО требуется установка дополнительных сертификатов проверки серверов используемых служб.

Tsp srf что это

Тестовый TSP-сервер работает на основе службы штампов времени «КриптоПро TSP Server».

Сервер работает по протоколу TSP поверх HTTP. Для обращения к серверу посредством обычного соединения необходимо использовать адрес http://testca2012.cryptopro.ru/tsp/tsp.srf или https://testca2012.cryptopro.ru/tsp/tsp.srf для соединения по протоколу КриптоПро TLS.

Сервер отвечает на запросы штампов времени.

Сертификат подписи штампов времени издан Тестовым Центром Сертификации КРИПТО-ПРО на основе КриптоПро УЦ 2.0.

Чтобы тестовое программное обеспечение доверяло меткам времени, полученным с данного сервера, необходимо установить корневой сертификат тестового Центра сертификации в хранилище сертификатов операционной системы «Доверенные корневые центры сертификации».

Для проверки штампов времени также необходим сам сертификат службы штампов. Его можно получить здесь или при указании в запросе на штамп времени флага certReq, тогда служба штампов включит свой сертификат в ответ. При использовании КриптоПро TSP Client этот сертификат можно установить в хранилище «Другие пользователи» для того, чтобы функции проверки штампа находили его автоматически.

Тестовая служба штампов времени выдаёт штампы только с политикой, которая является политикой для тестовых штампов времени и не предполагает никаких гарантий и никакой ответственности со стороны владельца службы — ООО «КРИПТО-ПРО».

OID тестовой политики можно не указывать в запросе. Для информации его значение 1.2.643.2.2.38.4.

Используйте данный TSP-сервер только в тестовых целях. Не следует доверять штампам времени, выданным этим сервером, также как и сертификатам тестового Центра сертификации.

УКЭП с TSP, OSCP и C# .NET Core 3.1

Я построю свой собственный сервис для подписания документов - FOX ©

Я построю свой собственный сервис для подписания документов — FOX ©

Важное вступление

В гайде описывается формирование отсоединенной подписи в формате PKCS7 (рядом с файлом появится файл в формате .sig). Такую подпись может запросить нотариус, ЦБ и любой кому нужно долгосрочное хранения подписанного документа. Удобство такой подписи в том, что при улучшении ее до УКЭП CAdES-X Long Type 1 (CMS Advanced Electronic Signatures [1]) в нее добавляется штамп времени, который генерирует TSA (Time-Stamp Protocol [2]) и статус сертификата на момент подписания (OCSP [3]) — подлинность такой подписи можно подтвердить по прошествии длительного периода (Усовершенствованная квалифицированная подпись [4]).

Код основан на репозиториях corefx и DotnetCoreSampleProject — в последнем проще протестировать свои изменения перед переносом в основной проект и он будет отправной точкой по сборке corefx. Судя по записям с форума компании [5], решение для .NET Core в стадии бета-тестирования. Далее по тексту я также буду ссылаться на этот форум. Разработка велась в Visual Studio Community 2019.

Для получения штампа времени использован TSP-сервис http://qs.cryptopro.ru/tsp/tsp.srf

Что имеем на входе?

КриптоПро CSP версии 5.0 — для поддержки Российских криптографических алгоритмов (подписи, которые выпустили в аккредитованном УЦ в РФ)

КриптоПро TSP Client 2.0 — нужен для штампа времени

КриптоПро OCSP Client 2.0 — проверит не отозван ли сертификат на момент подписания

КриптоПро .NET Client — таков путь

Любой сервис по проверке ЭП — я использовал Контур.Крипто как основной сервис для проверки ЭП и КриптоАРМ как локальный. А еще можно проверить ЭП на сайте Госуслуг

КЭП по ГОСТ Р 34.11-2012/34.10-2012 256 bit, которую выпустил любой удостоверяющий центр

КриптоПро CSP версии 5.0 — у меня установлена версия 5.0.11944 КС1, лицензия встроена в ЭП.

КриптоПро TSP Client 2.0 и КриптоПро OCSP Client 2.0 — лицензии покупается отдельно, а для гайда мне хватило демонстрационного срока.

КриптоПро .NET Client версии 1.0.7132.2 — в рамках этого гайда я использовал демонстрационную версию клиентской части и все действия выполнялись локально. Лицензию на сервер нужно покупать отдельно.

Контур.Крипто бесплатен, но требует регистрации. В нем также можно подписать документы КЭП, УКЭП и проверить созданную подпись загрузив ее файлы.

Так, а что надо на выходе?

А на выходе надо получить готовое решение, которое сделает отсоединенную ЭП в формате .sig со штампом времени на подпись и доказательством подлинности. Для этого зададим следующие критерии:

ЭП проходит проверку на портале Госуслуг, через сервис для подтверждения подлинности ЭП формата PKCS#7 в электронных документах;

КриптоАРМ после проверки подписи

Заполнит поле «Время создания ЭП» — в конце проверки появится окно, где можно выбрать ЭП и кратко посмотреть ее свойства

В информации о подписи и сертификате (двойной клик по записе в таблице) на вкладке «Штампы времени» в выпадающем списке есть оба значения и по ним заполнена информация:

В протоколе проверки подписи есть блоки «Доказательства подлинности», «Штамп времени на подпись» и «Время подписания». Для сравнения: если документ подписан просто КЭП, то отчет по проверке будет достаточно коротким в сравнении с УКЭП.

Контур.Крипто при проверке подписи выдаст сообщение, что совершенствованная подпись подтверждена, сертификат на момент подписания действовал и указано время создания подпись:

Соберем проект с поддержкой ГОСТ Р 34.11-2012 256 bit

Гайд разделен на несколько этапов. Основная инструкция по сборке опубликована вместе с репозиторием DotnetCoreSampleProject — периодически я буду на нее ссылаться.

Первым делом создадим новую папку

. и положим туда все необходимое.

Инструкция делится на 2 этапа — мне пришлось выполнить оба, чтобы решение заработало. В папку добавьте подпапки .\runtime и .\packages

I — Сборка проекта без сборки corefx для Windows

Установите КриптоПро 5.0 и убедитесь, что у вас есть действующая лицензия. — для меня подошла втроенная в ЭП;

Установите core 3.1 sdk и runtime и распространяемый пакет Visual C++ для Visual Studio 2015 обычно ставится вместе со студией; прим.: на II этапе мне пришлось через установщик студии поставить дополнительное ПО для разработки на C++ — сборщик требует предустановленный DIA SDK.

Задайте переменной среды DOTNET_MULTILEVEL_LOOKUP значение 0 — не могу сказать для чего это нужно, но в оригинальной инструкции это есть;

Скачайте 2 файла из релиза corefx (package_windows_debug.zip и runtime-debug-windows.zip) — они нужны для корректной сборки проекта. В гайде рассматривается версия v3.1.1-cprocsp-preview4.325 от 04.02.2021:

package_windows_debug.zip распакуйте в .\packages

runtime-debug-windows.zip распакуйте в .\runtime

Добавьте источник пакетов NuGet в файле %appdata%\NuGet\NuGet.Config — источник должен ссылаться на путь .\packages в созданной вами папке. Пример по добавлению источника есть в основной инструкеии. Для меня это не сработало, поэтому я добавил источник через VS Community;

Склонируйте NetStandard.Library в .\ и выполните PowerShell скрипт (взят из основной инструкции), чтобы заменить пакеты в $env:userprofile\.nuget\packages\

Измените файл .\DotnetSampleProject\DotnetSampleProject.csproj — для сборок System.Security.Cryptography.Pkcs.dll и System.Security.Cryptography.Xml.dll укажите полные пути к .\runtime;

Перейдите в папку проекта и попробуйте собрать решение. Я собирал через Visual Studio после открытия проекта.

II — Сборка проекта со сборкой corefx для Windows

Выполните 1-3 и 6-й шаги из I этапа;

Склонируйте репозиторий corefx в .\

Выполните сборку запустив .\corefx\build.cmd — на этом этапе потребуется предустановленный DIA SDK

Выполните шаги 5, 7-9 из I этапа. Вместо условного пути .\packages укажите .\corefx\artifacts\packages\Debug\NonShipping, а вместо .\runtime укажите .\corefx\artifacts\bin\runtime\netcoreapp-Windows_NT-Debug-x64

На этом месте у вас должно получиться решение, которое поддерживает ГОСТ Р 34.11-2012 256 bit.

Немного покодим

Потребуется 2 COM библиотеки: «CAPICOM v2.1 Type Library» и «Crypto-Pro CAdES 1.0 Type Library». Они содержат необходимые объекты для создания УКЭП.

В этом примере будет подписываться BASE64 строка, содержащая в себе PDF-файл. Немного доработав код можно будет подписать hash-значение этого фала.

Основной код для подписания был взят со страниц Подпись PDF с помощью УЭЦП- Page 2 (cryptopro.ru) и Подпись НЕОПРЕДЕЛЕНА при создании УЭЦП для PDF на c# (cryptopro.ru), но он использовался для штампа подписи на PDF документ. Код из этого гайда переделан под сохранение файла подписи в отдельный файл.

Условно процесс можно поделить на 4 этапа:

Поиск сертификата в хранилище — я использовал поиск по отпечатку в хранилище пользователя;

Чтение байтов подписанного файла;

Сохранение файла подписи рядом с файлом.

Пробный запуск

Для подписания возьмем PDF-документ, который содержит надпись «Тестовое заявление.»:

Больше для теста нам ничего не надоБольше для теста нам ничего не надо

Далее запустим программу и дождемся подписания файла:

Готово. Теперь можно приступать к проверкам.

Проверка в КриптоАРМ

Время создания ЭП заполнено:

Штамп времени на подпись есть:

Доказательства подлинности также заполнены:

В протоколе проверки есть блоки «Доказательства подлинности», «Штамп времени на подпись» и «Время подписания»:

Важно отметить, что серийный номер параметров сертификата принадлежит TSP-сервису http://qs.cryptopro.ru/tsp/tsp.srf

Проверка на Госуслугах

Проверка в Контур.Крипто

Гайд написан с исследовательской целью — проверить возможность подписания документов УКЭП с помощью самописного сервиса на .NET Core 3.1 с формированием штампов подлинности и времени подписания документов.

Безусловно это решение не стоит брать в работу «как есть» и нужны некоторые доработки, но в целом оно работает и подписывает документы подписью УКЭП.

Это вообще законно?

С удовольствием узнаю ваше мнение в комментариях.

Ссылки на публичные источники

[2] Internet X.509 Public Key Infrastructure Time-Stamp Protocol (TSP) — https://www.ietf.org/rfc/rfc3161.txt

[3] X.509 Internet Public Key Infrastructure Online Certificate Status Protocol — OCSP — https://tools.ietf.org/html/rfc2560

UPD1: Поменял в коде переменную, куда записываются байты файла подписи.

Также я забыл написать немного про подпись штампа времени — он подписывается сертификатом владельца TSP-сервиса. По гайду это ООО «КРИПТО-ПРО»:

UPD2: Про библиотеки CAdESCOM и CAPICOM

В ответ @kotov_a и @mayorovp- Все верно: для .NET Core 3.1 сборки System.Security.Cryptography.Pkcs.dll и System.Security.Cryptography.Xml.dll подменяются, так как поддержка этих алгоритмов в бета тестировании [5], а для .NET Framework 4.8 используется CryptoPro.Sharpei — он был перенесен в состав КриптоПро .NET. Последний, судя по информации с портала документации, работает только с .NET Framework.

Если создать пустой проект на .NET Core 3.1, подключив непропатченные библиотеки, то при обращении к закрытому ключу выпадет исключение «System.NotSupportedException» c сообщением «The certificate key algorithm is not supported.»:

.NET Core 3.1 - Исключение без пропатченных библиотек

.NET Core 3.1 — Исключение без пропатченных библиотек

Но при использовании пропатченных библиотек это исключение не выпадает и с приватным ключем можно взаимодействовать:

alba_fox

Вся информация размещенная на данном сайте носит ознакомительный характер.

В большей степени заметки (публикации) являются описанием проблемам, с которыми я столкнулся в процессе работы, а также способами их решения.

Все действия, которые вы делаете, вы делаете на свой страх и риск, автор статьи не несёт никакой ответственности за ваши действия.

Буду рад вашим замечаниям, которые вы можете оставить в комментарии к публикациям.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *