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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Владимир-С-  
#1 Оставлено : 23 июля 2019 г. 15:24:01(UTC)
Владимир-С-

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

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

Сказал(а) «Спасибо»: 1 раз
Есть служба на сервере, работающая в фоновом режиме (самописная, C#, .NetFramework 4.0). Для подписи используется сертификат крипто-про.
Для подписи создан статичный экземпляр класса X509Certificate2
Замечено следующее странное поведение:
1. первый файл подписывается с задержка 1 минута 30 секунд - остальные нормально
2. каждые полчаса снова происходит задержка - дальше тоже нормально

с экземпляром никакие операции кроме подписания не проводятся
с чем это может быть связано, как эту задержку можно убрать?
Offline two_oceans  
#2 Оставлено : 24 июля 2019 г. 8:08:35(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 396 раз в 366 постах
Немного сложно предугадывать ничего не зная о самописной программе. Предположу что задержка связана с проверкой списков отзыва или OCSP-ответчика на предмет отзыва сертификата, результат проверки на какое-то время кэшируется потом проверка производится снова.

Если проблема в этом, исправить можно разными способами - отключить проверку вообще (самый нежелательный способ - если вдруг будете отзывать сертификат придется все сервисы стопорить), отрегулировать интервал кэширования (в зависимости от интерфейса подписания может быть невозможно отрегулировать), скачивать списки отзыва на локальный сервер допустим раз в час и редиректить запросы на локальный сервер, отладить сетевую инфраструктуру чтобы задержка была меньше.

Если используется подпись со штампом доверенного времени, то задержка также может быть технологическая. Смысл в том, что штамп времени должен быть позже чем время самой подписи, но при этом многие сервера доверенного времени на бюджетных тарифах дают точность штампа 10 секунд, поэтому подписание может ждать до 9,99 секунд пока отметка времени не станет отличаться от времени подписи.
Offline Владимир-С-  
#3 Оставлено : 24 июля 2019 г. 10:12:52(UTC)
Владимир-С-

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

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline dedov  
#4 Оставлено : 25 июля 2019 г. 11:13:58(UTC)
dedov

Статус: Эксперт

Группы: Участники
Зарегистрирован: 03.04.2008(UTC)
Сообщений: 380
Мужчина
Откуда: Россия, г. Белгород

Сказал «Спасибо»: 11 раз
Поблагодарили: 9 раз в 9 постах
X509Certificate2 signerCert = findCertif();

вы каждый раз при подписи ищите сертификат для подписания!

ключи на чем находятся?
Offline Владимир-С-  
#5 Оставлено : 25 июля 2019 г. 12:05:49(UTC)
Владимир-С-

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

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

Сказал(а) «Спасибо»: 1 раз
Автор: dedov Перейти к цитате
X509Certificate2 signerCert = findCertif();

вы каждый раз при подписи ищите сертификат для подписания!

ключи на чем находятся?


Извините, код не совсем прозрачный) findCertif() по идее должен называться getCertif() - возвращает уже существующий сертификат X509Certificate2, если ранее он был найден. Есть переменная static X509Certificate2 _cert, где он хранится

Ключи находятся в LocalMashine в хранилище "Личные" (StoreName.My), пароль сброшен, хранится в реестре. Родительские сертификаты - тоже в LocalMashine, в разделе "Доверенные издатели"

Вопрос о задержке как раз и связан с тем, что переменная _cert инициализируется один раз, если он еще не был найден. Когда происходит задержка в самый первый раз - ладно, пусть ищет, проверят (всё равно странно, что всегда это занимает ровно полторы минуты). Но вот позже, когда служба работает стабильно, каждые полчаса (а в эти полчаса тоже подписываются документы, и очень быстро) снова повторяется картина с задержкой на те же ровные полторы минуты. Как будто срабатывает где-то внутри таймер и обнуляет сертификат в каком-то кэше. В каком это кэше, если это там, и как его настроить - совсем не понятно

Offline two_oceans  
#6 Оставлено : 26 июля 2019 г. 7:05:14(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 396 раз в 366 постах
Наводит на еще мысль. Не может по таймеру срабатывать какой-то сборщик мусора в памяти приложения и как-то подчищать статик переменную? К сожалению, я на Дельфи-совместимой среде работаю и в .NET не очень хорошо разбираюсь, возможно такая идея ну оооочень глупая. Однако после соседней темы где удалялся контейнер после 930 итераций из-за кривого конструктора класса это уже выглядит не так неправдоподобно.

Что время одинаковое это действительно странно. Не пробовали замерять точные интервалы времени на подписание в миллисекундах и куда-то в лог писать?

Отредактировано пользователем 26 июля 2019 г. 7:07:30(UTC)  | Причина: Не указана

Offline Андрей Писарев  
#7 Оставлено : 26 июля 2019 г. 10:25:54(UTC)
Андрей *

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

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

Сказал «Спасибо»: 574 раз
Поблагодарили: 2304 раз в 1805 постах
Здравствуйте.

Автор: Владимир-С- Перейти к цитате
Есть служба на сервере, работающая в фоновом режиме (самописная, C#, .NetFramework 4.0)


Её можно вызвать от текущего пользователя и проверить на "зависания"?
+ логирование участков кода добавить, чтобы точно знать, где происходит остановка и ожидание.





Техническую поддержку оказываем тут
Наша база знаний
Offline Владимир-С-  
#8 Оставлено : 26 июля 2019 г. 11:00:06(UTC)
Владимир-С-

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

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

Сказал(а) «Спасибо»: 1 раз
Автор: Андрей Писарев Перейти к цитате
Здравствуйте.

Автор: Владимир-С- Перейти к цитате
Есть служба на сервере, работающая в фоновом режиме (самописная, C#, .NetFramework 4.0)


Её можно вызвать от текущего пользователя и проверить на "зависания"?
+ логирование участков кода добавить, чтобы точно знать, где происходит остановка и ожидание.



добавив в службу логи, выяснил, что ожидание происходит на моменте

Код:
cms.ComputeSignature(_cmsSigner);


Попробовал _cmsSigner вывести за пределы метода подписания, чтобы, возможно, не переинициализировать класс подписывания - не помогло
Offline Андрей Писарев  
#9 Оставлено : 26 июля 2019 г. 11:40:10(UTC)
Андрей *

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

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

Сказал «Спасибо»: 574 раз
Поблагодарили: 2304 раз в 1805 постах
т.е. зависло на 1.5мин, а следующее, сразу, подписание - без проблем?

Техническую поддержку оказываем тут
Наша база знаний
Offline Владимир-С-  
#10 Оставлено : 26 июля 2019 г. 12:07:36(UTC)
Владимир-С-

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

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.