Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline dreamwalker  
#1 Оставлено : 17 марта 2022 г. 13:44:10(UTC)
dreamwalker

Статус: Новичок

Группы: Участники
Зарегистрирован: 17.03.2022(UTC)
Сообщений: 3
Российская Федерация
Откуда: Барнаул

Сказал(а) «Спасибо»: 1 раз
Возникла проблема при подписании файлов при работе с физическими токенами.
У нас есть достаточно большое количество PDF и XML-файлов. Для каждого из этих файлов мы создаём по две откреплённые ЭЦП - условно, подпись конкретного пользователя и подпись организации.
Само подписание реализуем через КриптоПро CSP и КриптоПро ЭЦП Browser plug-in.

Проблема заключается в следующем: если при подписании использовать сертификат, установленный в локальное хранилище на компьютере - все подписи создаются быстро, никаких проблем нет. Выходит примерно 10-40 мс на создание каждой откреплённой подписи.
Но если использовать физические токены (например, сертификат на каком-нибудь Рутокен S) - каждая подпись начинает создаваться в разы дольше (в районе 700-1000мс).

Вот пример кода, который сейчас используется. Он основан на примерах подписания из документации. Специально упростил его до двух последовательных вызовов SignCades друг за другом, чтобы исключить влияние размеров файлов, влияние функций создания атрибутов и т.п.


Я понимаю, что чтение физического токена - дело не быстрое, в том числе из-за разницы в скоростях интерфейсов, поэтому сначала мы просто смирились с этим ограничением.

Но потом наши партнёры дали поработать со своим проектом, написанным на Python и использующим вызовы C-функций. Первое подписание в нём также выполняется в районе 700-1000мс, но все последующие - около 100мс. Подписи оттуда выходят валидными, проверки проходят.
К сожалению, я не могу описать, каким образом работает этот проект, т.к. разбирался в нём пока только поверхностно.
Судя по всему, после первого подписания сохраняется некий "контекст сертификата", который затем переиспользуется, и к физическому токену идёт обращение только для получения private key.
При подписании в том проекте используется некая функция CryptSignMessage, которая под Linux вызывается из библиотеки libcapi20.so. Сигнатура функции совпадает с описанной здесь в MSDN.

Подскажите, пожалуйста, можно ли при работе через плагин КриптоПро реализовать что-то подобное в плане временного хранения "контекста сертификата", и тем самым ускорить процесс подписания через плагин? Или подобное достигается только "переездом" с плагина на вызовы нативных функций?
Или может быть я упустил что-то, и в указанном выше коде есть какие-то проблемы, из-за чего с физического токена постоянно читаются какие-то лишние данные?

Доп.информация:
ОС: Linux Mint 20.2 Uma (оболочка Cinnamon, базовый дистрибутив Ubuntu 20.04 focal)
Версия плагина: 2.0.14530
Версия криптопровайдера: 5.0.12417
Криптопровайдер: Crypto-Pro GOST R 34.10-2012 KC1 CSP
Тип создаваемых подписей: CAdES-BES
Offline Санчир Момолдаев  
#2 Оставлено : 17 марта 2022 г. 16:37:16(UTC)
Санчир Момолдаев

Статус: Сотрудник

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 1,223
Российская Федерация

Сказал(а) «Спасибо»: 101 раз
Поблагодарили: 290 раз в 270 постах
Добрый день!

начиная с 5.0 R2 изменили логику кэширования закрытых ключей.

"Легальных ситуаций, когда "я вставил токен, подписал, вытащил, хочу еще подписать" не может быть в принципе."

для обхода необходимо внести некоторые изменения.
создать DWORD32 параметр с названием AllowWorkWithoutCarrier со значением 1
по пути
Компьютер\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Crypto Pro\Cryptography\CurrentVersion\Parameters

перезапустить приклад и проверить.

более подробно смотрите в документации
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Санчир Момолдаев за этот пост.
dreamwalker оставлено 18.03.2022(UTC)
Offline dreamwalker  
#3 Оставлено : 18 марта 2022 г. 6:41:17(UTC)
dreamwalker

Статус: Новичок

Группы: Участники
Зарегистрирован: 17.03.2022(UTC)
Сообщений: 3
Российская Федерация
Откуда: Барнаул

Сказал(а) «Спасибо»: 1 раз
Спасибо за ответ!

Автор: Санчир Момолдаев Перейти к цитате
создать DWORD32 параметр с названием AllowWorkWithoutCarrier со значением 1
по пути
Компьютер\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Crypto Pro\Cryptography\CurrentVersion\Parameters

Не могли бы вы уточнить, правильно ли я понимаю, что под Linux x64 вместо реестра следует вносить правки в файл /etc/opt/cprocsp/config64.ini?

Сейчас добавил AllowWorkWithoutCarrier=1 в этот файл (в блок [Parameters]), перезагрузил систему для применения настроек и попробовал проверить подписание через Browser plugin ещё раз.
Стало подписываться действительно быстрее, теперь ~500-600мс на 1 подпись вместо прошлых ~700-1000мс. Но, к сожалению, это всё ещё далеко от ~100мс через вызовы C-функций...
Проверил и второй проект - он стал работать ещё быстрее, теперь там вообще вместо ~100мс получается ~10мс на подпись с физическим токеном.

Может быть существуют ещё какие-то параметры, которые можно здесь изменить для ускорения чтения?
Например, в инструкции по использованию под Windows есть скриншот такой панели:

Но под Linux в приложении "Инструменты КриптоПро" нет подобных настроек, связанных с безопасностью, а других GUI-приложений, насколько я понимаю, нет. В инструкции тоже не смог найти ничего подобного...

Автор: Санчир Момолдаев Перейти к цитате
"Легальных ситуаций, когда "я вставил токен, подписал, вытащил, хочу еще подписать" не может быть в принципе."

Да, я понимаю это, и сразу появилось подозрение, что в проекте, который работал через вызовы CryptSignMessage, ключ кэшируется после первого подписания, и токен вообще перестаёт читаться.
Поэтому я ранее проверял, что будет, если выдернуть токен в процессе подписания. Подписание остановилось с ошибкой от КриптоПро о том, что не удаётся прочитать закрытый ключ, т.е. ключ действительно читается в процессе подписания конкретного документа. Да и по моргающему индикатору на токене видно, что идёт какой-то обмен.

Дело ведь в том, что оба проекта запускаются на одном и том же компьютере, работают с одним и тем же криптопровайдером, отличия только в том, что первый проект работает через плагин, а второй - с вызовами функций CryptoAPI 2.0 из libcapi20.so. И по какой-то причине - такая разница в скорости подписания... Может всё-таки в моём коде что-то не то (который указывал в первом посте), или у плагина есть какие-то ограничения?
Offline Санчир Момолдаев  
#4 Оставлено : 21 марта 2022 г. 7:48:37(UTC)
Санчир Момолдаев

Статус: Сотрудник

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 1,223
Российская Федерация

Сказал(а) «Спасибо»: 101 раз
Поблагодарили: 290 раз в 270 постах
между двумя
Цитата:
Signature1 = await oSignedData.SignCades(oSigner, this.api.CADESCOM_CADES_BES, true); //Первая подпись - вызов занимает ~700мс
Signature2 = await oSignedData.SignCades(oSigner, this.api.CADESCOM_CADES_BES, true); //Вторая подпись - вызов занимает ещё ~700мс

сколько времени проходит?
Техническую поддержку оказываем тут
Наша база знаний
Offline dreamwalker  
#5 Оставлено : 22 марта 2022 г. 16:45:49(UTC)
dreamwalker

Статус: Новичок

Группы: Участники
Зарегистрирован: 17.03.2022(UTC)
Сообщений: 3
Российская Федерация
Откуда: Барнаул

Сказал(а) «Спасибо»: 1 раз
Извините, но не совсем понимаю вопрос.

В том коде, который я приложил, второе подписание выполняется сразу же после выполнения первого. Никаких иных действий между этими 2 строками не выполняется.
Без AllowWorkWithoutCarrier каждое подписание выполняется по ~700мс, с ним - 500-600мс.
Offline Санчир Момолдаев  
#6 Оставлено : 23 марта 2022 г. 0:33:06(UTC)
Санчир Момолдаев

Статус: Сотрудник

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 1,223
Российская Федерация

Сказал(а) «Спасибо»: 101 раз
Поблагодарили: 290 раз в 270 постах
хотел уточнить сколько сейчас проходит времени между двумя вызовами signCades в js

можно попробовать хранить ключи в KC2 и указать в блоке parameters
cached=8
(кол-во кэшируемых закрытых ключей)
и посмотреть работу так
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.