При переходе на новые релизы платформы 1С:Предприятие (в частности, ветки 8.3.24) многие администраторы и разработчики сталкиваются с критической ошибкой: при открытии форм «Настройка электронной подписи и шифрования», работе с маркировкой («Честный Знак», эмиссия кодов), сервисами ЭДО или проверке сертификатов сеанс 1С намертво зависает. Причем первая проверка ЭЦП часто проходит успешно, а на второй попытке процесс полностью прекращает отвечать. Разберем по шагам, почему возникает эта неполадка, в каком коде она локализуется и какими способами можно восстановить стабильную работу системы.
Проанализируем поведение системы под отладчиком. Зависание происходит в модулях Библиотеки стандартных подсистем (БСП), обслуживающих криптографические операции. Процесс останавливается в общем модуле ЭлектроннаяПодписьСлужебный внутри функции проверки сертификата:
// Для функции ПроверитьСертификат
Функция ПроверитьСертификатНаКорректность(МенеджерКриптографииДляПроверки, СертификатДляПроверки, РежимыПроверкиСертификата, ОписаниеОшибки, ВызыватьИсключение)
Попытка
МенеджерКриптографииДляПроверки.ПроверитьСертификат(СертификатДляПроверки, РежимыПроверкиСертификата);
Возврат Истина;
Исключение
ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
КонецПопытки;
КонецФункции
При вызове метода МенеджерКриптографииДляПроверки.ПроверитьСертификат выполнение потока блокируется без генерации исключения, из-за чего блок Попытка ... Исключение не срабатывает, а приложение перестает отвечать на действия пользователя. Рассмотрим комплекс проверенных решений для устранения этой проблемы.
В типовых конфигурациях («1С:Бухгалтерия предприятия», «1С:Управление торговлей», «1С:ERP») взаимодействие с криптопровайдерами частично опирается на внешнюю компоненту ExtraCryptoAPI. В некоторых сборках конфигураций устаревшая версия компоненты вызывает конфликт при обращении к CryptoAPI операционной системы.
СертификатыКлючейЭлектроннойПодписиИШифрования.ExtraCryptoAPI.Одной из частых причин глухого зависания метода ПроверитьСертификат является сетевой таймаут при обращении к внешним спискам отзыва (CRL или сервисам OCSP) удостоверяющих центров. Если адрес недоступен или фильтруется межсетевым экраном без отправки сброса TCP-соединения, поток ожидает системный ответ операционной системы.
Проверим эту гипотезу и исключим проверку списков отзыва. Для этого создадим расширение конфигурации и переопределим параметры проверки:
&Вместо("ПроверитьСертификатНаКорректность")
Функция Расш1_ПроверитьСертификатНаКорректность(МенеджерКриптографииДляПроверки, СертификатДляПроверки, РежимыПроверкиСертификата, ОписаниеОшибки, ВызыватьИсключение)
// Добавляем режим пропуска проверки по спискам отзыва
Если РежимыПроверкиСертификата = Неопределено Тогда
РежимыПроверкиСертификата = Новый Массив;
КонецЕсли;
// Исключаем сетевой опрос недоступных точек распространения списков отзыва
РежимыПроверкиСертификата.Добавить(РежимПроверкиСертификата.ИгнорироватьПроверкуВСпискеОтозванныхСертификатов);
Попытка
МенеджерКриптографииДляПроверки.ПроверитьСертификат(СертификатДляПроверки, РежимыПроверкиСертификата);
Возврат Истина;
Исключение
ОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке);
Возврат Ложь;
КонецПопытки;
КонецФункции
Если после добавления режима ИгнорироватьПроверкуВСпискеОтозванныхСертификатов зависания прекратились, причина заключается в недоступности внешних сетевых узлов УЦ с рабочего места или сервера 1С.
Если в информационной базе включена опция проверки и подписания на сервере, методы криптографии инициируются рабочим процессом сервера rphost под учетной записью службы (например, USR1CV8). У этой системной службы часто отсутствуют необходимые сетевые маршруты, права доступа к сертификатам или интерактивный контекст.
Когда работа организована через терминальный сервер (RDP), зависание при открытии форм подписи часто связано с конфликтом системной службы смарт-карт Windows (SCardSvr) и пробросом клиентских устройств.
Разберем по шагам оптимизацию терминальной среды:
В некоторых сборках платформы 1С:Предприятие ветки 8.3.24 зарегистрирована ошибка взаимной блокировки (deadlock) потоков рабочего процесса rphost при повторном обращении к криптографическим библиотекам операционной системы. Именно поэтому первая проверка отрабатывает успешно, а следующая парализует работу, и восстановить процесс помогает лишь перезапуск службы 1C:Enterprise Server.
Для гарантированного устранения проблемы рекомендуется обновить платформу 1С:Предприятие до актуальных релизов с исправлением ошибок многопоточной работы криптографии либо перейти на проверенную стабильную ветку платформы.