Параметры соединения с TSP службой

В качестве протокола можно указать «http», «https» или «tcp», если это позволяют настройки службы.
Адреса служб штампов времени, доступных для тестирования:
- Digt TSP Server (для работы с ГОСТ криптографическими алгоритмами):
http://ca.digt.ru/tsp/tsp.srf - Digt TSP Server (для работы со стандартными /ОС Windows/ криптографическими алгоритмами):
http://ca.digt.ru/tsp-rsa/tsp.srf - КриптоПро TSP Server (для работы с ГОСТ криптографическими алгоритмами):
http://www.cryptopro.ru/tsp/tsp.srf
Типы аутентификации
В случае если не используется прокси-сервер, необходимо задать тип аутентификации для соединения со службой. Для этого нажмите на кнопку Дополнительно (напротив поля Адрес Службы штампов), и укажите тип аутентификации:

Типы аутентификации
Назначение
Тип требует задать Логин и Пароль
При такой проверке подлинности пароли и имена пользователей кодируются, но не шифруются. Следует учитывать, что при обычной проверке подлинности пароли передаются по сети в незашифрованном виде. При несанкционированном доступе к данным имена пользователей и пароли могут быть перехвачены.
Тип требует задать Логин и Пароль
При краткой проверке подлинности по сети отправляется не пароль, а хэш-значение. Этот способ предназначен для работы с прокси-серверами и другими брандмауэрами. Пароль при краткой проверке подлинности не передается открытым текстом.
Этот способ проверки оптимален в среде интрасети, где пользователи имеют учетные записи домена Windows. При встроенной проверке подлинности Windows имя пользователя и пароль не передаются от клиента к серверу. Если пользователь зарегистрирован как пользователь домена на локальном компьютере, для его доступа к сетевому компьютеру в этом домене повторная проверка подлинности не требуется.
В реализации протокола Kerberos предусмотрен безопасный способ передачи по сети сеансового ключа шифрования, в котором содержится основная информация для проведения аутентификации пользователя. В протоколе Kerberos аутентификация основана на шифровании с применением симметричного ключа.
Настройки прокси-сервера
Если аутентификация будет осуществляться через прокси-сервер, необходимо задать параметры доступа к нему:
- Установить флаг в поле Использовать настройки прокси-сервера
- Указать Адрес прокси-сервера (кнопка Настроить) и тип аутентификации
Использование клиентского сертификата для аутентификации
Если служба штампов времени настроена на аутентификацию по сертификату (для передачи запроса используется протокол https), необходимо указать сертификат клиентской аутентификации, выбрав его из персонального хранилища пользователя. (Сертификат должен иметь расширенное использование ключа – Client Authentication (1.3.6.1.5.5.7.3.2) и должен быть выпущен УЦ, которому доверяет Служба штампов).
Установка штампа времени при подписании документов
Для подтверждения точного времени подписания документа используется специальный штамп. Это один из механизмов формирования улучшенной (усовершенствованной) подписи. Он создается на основании запросов в Службу штампов времени (TSP-сервис).
Также отправляется запрос в OCSP-сервис, чтобы подтвердить статус сертификата на момент подписания.
В СБИС
Штамп времени в СБИС устанавливается в документе автоматически при использовании любой электронной подписи. Его данные отображаются в штампе об электронной подписи в печатной форме документа.
Печать даты подписания на штампе ЭП — дополнительная функция, которую можно отключить в настройках.

В других системах
При создании улучшенной подписи в других системах (например, КриптоАРМ Стандарт ПЛЮС) может потребоваться настройка — указание адресов серверов.
Для подписи, выданной удостоверяющим центром «Тензор»:
- TSP-сервис — http://tax4.tensor.ru/tsp-tensor_gost2012/tsp.srf.
- OCSP-сервис — содержится в самой ЭП. Откройте сертификат на вкладке «Состав» и в списке выберите «Доступ к информации о центре сертификации».

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

КриптоПро УЦ
- КриптоПро УЦ 1.5
- Использование
- Приобретение
- Лицензирование
- Производительность
- Загрузка
- Преимущества
- Использование
- Приобретение
- Лицензирование
- Практикум по развёртыванию
- Загрузка
- КриптоПро OCSP
- Задачи
- Использование
- Тестовый OCSP-сервер
- КриптоПро OCSP SDK
- КриптоПро OCSP Client
- КриптоПро OCSPUTIL
- Загрузка файлов
- Задачи
- Использование
- Тестовый TSP-сервер
- КриптоПро TSP Client
- КриптоПро TSP SDK
- КриптоПро TSPUTIL
- Загрузка файлов
- Загрузка файлов
- Загрузка файлов
- Загрузка файлов
Купить
Вход
Услуги УЦ
Услуги СЭП
Подписка
Тестовый TSP-сервер
Тестовый 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

В гайде описывается формирование отсоединенной подписи в формате 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
git clone https://github.com/CryptoProLLC/NetStandard.Library New-Item -ItemType Directory -Force -Path "$env:userprofile\.nuget\packages\netstandard.library" Copy-Item -Force -Recurse ".\NetStandard.Library\nugetReady\netstandard.library" -Destination "$env:userprofile\.nuget\packages\"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 этапа:
- Поиск сертификата в хранилище — я использовал поиск по отпечатку в хранилище пользователя;
- Чтение байтов подписанного файла;
- Создание УКЭП;
- Сохранение файла подписи рядом с файлом.
using CAdESCOM; using CAPICOM; using System; using System.Globalization; using System.IO; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Security.Cryptography.Xml; using System.Text; using System.Threading.Tasks; using System.Xml; public static void Main() < //Сертификат для подписи X509Certificate2 gostCert = GetX509Certificate2("отпечаток"); //Файл, который предстоит подписать byte[] fileBytes = File.ReadAllBytes("C:\\Тестовое заявление.pdf"); //Файл открепленной подписи byte[] signatureBytes = SignWithAdvancedEDS(fileBytes, gostCert); //Сохранение файла подписи File.WriteAllBytes("C:\\Users\\mikel\\Desktop\\Тестовое заявление.pdf.sig", signatureBytes); >//Поиск сертификата в хранилище public static X509Certificate2 GetX509Certificate2(string thumbprint) < X509Store store = CreateStoreObject("My", StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly); X509Certificate2Collection certCollection = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false); X509Certificate2Enumerator enumerator = certCollection.GetEnumerator(); X509Certificate2 gostCert = null; while (enumerator.MoveNext()) gostCert = enumerator.Current; if (gostCert == null) throw new Exception("Certificiate was not found!"); return gostCert; >//Создание УКЭП public static byte[] SignWithAdvancedEDS(byte[] fileBytes, X509Certificate2 certificate) < string signature = ""; try < string tspServerAddress = @"http://qs.cryptopro.ru/tsp/tsp.srf"; CPSigner cps = new CPSigner(); cps.Certificate = GetCAPICOMCertificate(certificate.Thumbprint); cps.Options = CAPICOM_CERTIFICATE_INCLUDE_OPTION.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN; cps.TSAAddress = tspServerAddress; CadesSignedData csd = new CadesSignedData(); csd.ContentEncoding = CADESCOM_CONTENT_ENCODING_TYPE.CADESCOM_BASE64_TO_BINARY; csd.Content = Convert.ToBase64String(fileBytes); //Создание и проверка подписи CAdES BES signature = csd.SignCades(cps, CADESCOM_CADES_TYPE.CADESCOM_CADES_BES, true, CAdESCOM.CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BASE64); csd.VerifyCades(signature, CADESCOM_CADES_TYPE.CADESCOM_CADES_BES, true); //Дополнение и проверка подписи CAdES BES до подписи CAdES X Long Type 1 //(вторая подпись остается без изменения, так как она уже CAdES X Long Type 1) signature = csd.EnhanceCades(CADESCOM_CADES_TYPE.CADESCOM_CADES_X_LONG_TYPE_1, tspServerAddress, CAdESCOM.CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BASE64); csd.VerifyCades(signature, CADESCOM_CADES_TYPE.CADESCOM_CADES_X_LONG_TYPE_1, true); >catch (Exception ex) < throw ex; >return Convert.FromBase64String(signature); >Пробный запуск
Для подписания возьмем PDF-документ, который содержит надпись «Тестовое заявление.»:
Далее запустим программу и дождемся подписания файла:

Готово. Теперь можно приступать к проверкам.
Проверка в КриптоАРМ
Время создания ЭП заполнено:

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

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

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



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

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

Done.
Гайд написан с исследовательской целью — проверить возможность подписания документов УКЭП с помощью самописного сервиса на .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.»:

netcoreapp3.1 . .tlbimp 0 1 e00b169c-ae7f-45d5-9c56-672e2b8942e0 0 false true tlbimp 1 2 bd26b198-ee42-4725-9b23-afa912434229 0 false true Но при использовании пропатченных библиотек это исключение не выпадает и с приватным ключем можно взаимодействовать:

netcoreapp3.1 . ..\corefx\artifacts\bin\runtime\netcoreapp-Windows_NT-Debug-x64\System.Security.Cryptography.Pkcs.dll .\corefx\artifacts\bin\runtime\netcoreapp-Windows_NT-Debug-x64\System.Security.Cryptography.Xml.dll Также код из гайда работает с .NET Framework 4.8 без использования пропатченных библиотек, но вместо обращения к пространству имен «System.Security.Cryptography», которое подменяется пропатченными библиотеками для .NET Core, CSP Gost3410_2012_256CryptoServiceProvider будет использован из пространства имен «CryptoPro.Sharpei»:

v4.8 . .1 0 0 tlbimp False True 2 1 0 tlbimp False True 1 0 0 tlbimp False True - .NET
- Разработка под Windows