Статус: Новичок
Группы: Участники
Зарегистрирован: 23.07.2019(UTC) Сообщений: 9  Сказал(а) «Спасибо»: 1 раз
|
Есть служба на сервере, работающая в фоновом режиме (самописная, C#, .NetFramework 4.0). Для подписи используется сертификат крипто-про. Для подписи создан статичный экземпляр класса X509Certificate2 Замечено следующее странное поведение: 1. первый файл подписывается с задержка 1 минута 30 секунд - остальные нормально 2. каждые полчаса снова происходит задержка - дальше тоже нормально
с экземпляром никакие операции кроме подписания не проводятся с чем это может быть связано, как эту задержку можно убрать?
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 396 раз в 366 постах
|
Немного сложно предугадывать ничего не зная о самописной программе. Предположу что задержка связана с проверкой списков отзыва или OCSP-ответчика на предмет отзыва сертификата, результат проверки на какое-то время кэшируется потом проверка производится снова.
Если проблема в этом, исправить можно разными способами - отключить проверку вообще (самый нежелательный способ - если вдруг будете отзывать сертификат придется все сервисы стопорить), отрегулировать интервал кэширования (в зависимости от интерфейса подписания может быть невозможно отрегулировать), скачивать списки отзыва на локальный сервер допустим раз в час и редиректить запросы на локальный сервер, отладить сетевую инфраструктуру чтобы задержка была меньше.
Если используется подпись со штампом доверенного времени, то задержка также может быть технологическая. Смысл в том, что штамп времени должен быть позже чем время самой подписи, но при этом многие сервера доверенного времени на бюджетных тарифах дают точность штампа 10 секунд, поэтому подписание может ждать до 9,99 секунд пока отметка времени не станет отличаться от времени подписи.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 23.07.2019(UTC) Сообщений: 9  Сказал(а) «Спасибо»: 1 раз
|
Автор: two_oceans  Немного сложно предугадывать ничего не зная о самописной программе. Предположу что задержка связана с проверкой списков отзыва или OCSP-ответчика на предмет отзыва сертификата, результат проверки на какое-то время кэшируется потом проверка производится снова.
Если проблема в этом, исправить можно разными способами - отключить проверку вообще (самый нежелательный способ - если вдруг будете отзывать сертификат придется все сервисы стопорить), отрегулировать интервал кэширования (в зависимости от интерфейса подписания может быть невозможно отрегулировать), скачивать списки отзыва на локальный сервер допустим раз в час и редиректить запросы на локальный сервер, отладить сетевую инфраструктуру чтобы задержка была меньше.
Если используется подпись со штампом доверенного времени, то задержка также может быть технологическая. Смысл в том, что штамп времени должен быть позже чем время самой подписи, но при этом многие сервера доверенного времени на бюджетных тарифах дают точность штампа 10 секунд, поэтому подписание может ждать до 9,99 секунд пока отметка времени не станет отличаться от времени подписи. Наша программа использует стандартный способ подписания через библиотеку System.Security поиск сертификата (один раз при старте службы) - не проверяет валидность: Код:
X509Certificate2Collection found = store.Certificates.Find(
X509FindType.FindBySerialNumber,
SerialNumberString,
false
);
подписание - ничего лишнего: Код:
X509Certificate2 signerCert = findCertif();
// Создаем объект ContentInfo по сообщению.
// Это необходимо для создания объекта SignedCms.
ContentInfo contentInfo = new ContentInfo(data);
SignedCms cms = new SignedCms(contentInfo, true);
// Определяем подписывающего, объектом CmsSigner.
CmsSigner cmsSigner = new CmsSigner(signerCert);
// Подписываем CMS/PKCS #7 сообение.
cms.ComputeSignature(cmsSigner, false);
Подскажите, где можно настроить кеширование/отключение проверки? Эти настройки находятся в криптопро или это внутренний механизм .Net? Отредактировано пользователем 24 июля 2019 г. 10:23:32(UTC)
| Причина: Не указана
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 03.04.2008(UTC) Сообщений: 380  Откуда: Россия, г. Белгород Сказал «Спасибо»: 11 раз Поблагодарили: 9 раз в 9 постах
|
X509Certificate2 signerCert = findCertif();
вы каждый раз при подписи ищите сертификат для подписания!
ключи на чем находятся?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 23.07.2019(UTC) Сообщений: 9  Сказал(а) «Спасибо»: 1 раз
|
Автор: dedov  X509Certificate2 signerCert = findCertif();
вы каждый раз при подписи ищите сертификат для подписания!
ключи на чем находятся? Извините, код не совсем прозрачный) findCertif() по идее должен называться getCertif() - возвращает уже существующий сертификат X509Certificate2, если ранее он был найден. Есть переменная static X509Certificate2 _cert, где он хранится Ключи находятся в LocalMashine в хранилище "Личные" (StoreName.My), пароль сброшен, хранится в реестре. Родительские сертификаты - тоже в LocalMashine, в разделе "Доверенные издатели" Вопрос о задержке как раз и связан с тем, что переменная _cert инициализируется один раз, если он еще не был найден. Когда происходит задержка в самый первый раз - ладно, пусть ищет, проверят (всё равно странно, что всегда это занимает ровно полторы минуты). Но вот позже, когда служба работает стабильно, каждые полчаса (а в эти полчаса тоже подписываются документы, и очень быстро) снова повторяется картина с задержкой на те же ровные полторы минуты. Как будто срабатывает где-то внутри таймер и обнуляет сертификат в каком-то кэше. В каком это кэше, если это там, и как его настроить - совсем не понятно
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 396 раз в 366 постах
|
Наводит на еще мысль. Не может по таймеру срабатывать какой-то сборщик мусора в памяти приложения и как-то подчищать статик переменную? К сожалению, я на Дельфи-совместимой среде работаю и в .NET не очень хорошо разбираюсь, возможно такая идея ну оооочень глупая. Однако после соседней темы где удалялся контейнер после 930 итераций из-за кривого конструктора класса это уже выглядит не так неправдоподобно. Что время одинаковое это действительно странно. Не пробовали замерять точные интервалы времени на подписание в миллисекундах и куда-то в лог писать? Отредактировано пользователем 26 июля 2019 г. 7:07:30(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,734   Сказал «Спасибо»: 574 раз Поблагодарили: 2304 раз в 1805 постах
|
Здравствуйте. Автор: Владимир-С-  Есть служба на сервере, работающая в фоновом режиме (самописная, C#, .NetFramework 4.0) Её можно вызвать от текущего пользователя и проверить на "зависания"? + логирование участков кода добавить, чтобы точно знать, где происходит остановка и ожидание. |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 23.07.2019(UTC) Сообщений: 9  Сказал(а) «Спасибо»: 1 раз
|
Автор: Андрей Писарев  Здравствуйте. Автор: Владимир-С-  Есть служба на сервере, работающая в фоновом режиме (самописная, C#, .NetFramework 4.0) Её можно вызвать от текущего пользователя и проверить на "зависания"? + логирование участков кода добавить, чтобы точно знать, где происходит остановка и ожидание. добавив в службу логи, выяснил, что ожидание происходит на моменте Код:cms.ComputeSignature(_cmsSigner);
Попробовал _cmsSigner вывести за пределы метода подписания, чтобы, возможно, не переинициализировать класс подписывания - не помогло
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,734   Сказал «Спасибо»: 574 раз Поблагодарили: 2304 раз в 1805 постах
|
т.е. зависло на 1.5мин, а следующее, сразу, подписание - без проблем?
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 23.07.2019(UTC) Сообщений: 9  Сказал(а) «Спасибо»: 1 раз
|
Автор: Андрей Писарев  т.е. зависло на 1.5мин, а следующее, сразу, подписание - без проблем?
Всё выглядит так: 1. Подписание первого файла - 1,5 с 2. Подписание второго файла - 1,5 с 3. Подписание третьего файла - 1,5 с 4. Подписание четвертого файла - 1,5 с 5 и дальше - практически мгновенно (~46 мс) ждем минутку и снова подписываем - все файлы обрабатываются также почти мгновенно проходит минут пять, пробуем снова подписать (служба в этот момент находится в памяти, все переменные для подписания за пределами метода подписания, т.е. их экземпляры лежат в памяти на всё время работы службы) 1й файл - 1,5 с 2й и далее- почти мгновенно проходит еще 5 минут - подписываем - все почти мгновенно ждем где-нибудь полчасика, чтобы все "отдохнули" - и снова 1й файл - 1,5 с 2й и далее- почти мгновенно Отредактировано пользователем 26 июля 2019 г. 12:09:52(UTC)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close