При организации взаимодействия учётной системы 1С со службами проверки маркированного товара (модули ЕСМ / ТС ПИоТ) разработчики нередко сталкиваются с ситуацией, когда на локальном компьютере кассы обмен данными по протоколу HTTPS проходит штатно, однако при переносе рабочего места в терминальную среду (RDP) отправка запросов завершается сбоем.
В момент вызова метода Send объекта WinHttp.WinHttpRequest.5.1 платформа генерирует исключительную ситуацию с сообщением: «Имя узла в сертификате недопустимо либо не соответствует». Выясним причину такого поведения сетевого стека, проанализируем архитектурные особенности сертификации модуля ЕСМ и рассмотрим варианты решения проблемы — от правильной установки сертификатов до программного управления флагами безопасности WinHTTP в 1С.
Проанализируем механизм установки защищенного соединения по протоколу HTTPS. Клиентская библиотека WinHTTP при рукопожатии TLS выполняет строгую проверку соответствия узла: доменное имя или IP-адрес, указанный в строке запроса, обязательно должен совпадать со значением поля Common Name (CN) либо списком альтернативных имен субъекта (Subject Alternative Name / SAN) в полученном сертификате сервера.
В случае с модулем ЕСМ (ПИоТ) при его первоначальной установке на компьютере кассы автоматически генерируется локальный самоподписанный SSL-сертификат. Если в операционной системе на сетевом интерфейсе включен протокол IPv6, внутренний генератор службы нередко выбирает в качестве основного адреса локальный link-local IPv6-адрес (начинающийся с fe80::...). Когда сеанс 1С на сервере RDP пытается обратиться к кассе по классическому IPv4-адресу (например, https://192.168.1.50:51401/api/v1/info), библиотека WinHTTP фиксирует явное расхождение сетевого адреса и отклоняет соединение.
Вторая проблема заключается в том, что сам корневой удостоверяющий центр (CA), выпустивший этот локальный сертификат, отсутствует в списке доверенных на сервере терминалов RDP.
Разберем по шагам наиболее безопасный и системный способ устранения ошибки, не требующий отключения проверок безопасности в коде.
Корневой сертификат удостоверяющего центра модуля ЕСМ должен быть добавлен в доверенные хранилища как на машине с запущенным сервисом, так и на сервере RDP, откуда происходят обращения из 1С.
C:\ProgramData\ESP\ESM\um.ESP CM CA).certlm.msc в командной строке или через окно «Выполнить»). Обратите внимание: крайне важно устанавливать сертификат именно в хранилище «Локальный компьютер», а не в хранилище текущего пользователя, чтобы все сеансы кассиров и фоновые задания имели к нему доступ.После правильного размещения корневого сертификата система признает центр выдачи легитимным, и браузер перестанет выдавать предупреждение о неизвестном издателе.
Даже при установленном корневом сертификате WinHTTP продолжит блокировать запросы, если в сертификате прописан IPv6-адрес, а подключение идет по IPv4. Рассмотрим, как заставить модуль выпустить корректный сертификат:
hosts на сервере RDP (расположенном в C:\Windows\System32\drivers\etc\hosts) сопоставим IP-адрес кассового компьютера с его сетевым именем.https://kassa1:51401/api/v1/info.Если сроки запуска не позволяют перенастраивать сетевые службы на десятках удаленных касс, можно скорректировать логику проверки в самом объекте WinHttp.WinHttpRequest.5.1.
В WinHTTP за управление проверками сертификатов отвечает свойство Option(4) (флаг WinHttpRequestOption_SslErrorIgnoreFlags). Однако во встроенном языке 1С отсутствует синтаксическая поддержка записи в параметризованные COM-свойства вида Объект.Свойство(Параметр) = Значение. Попытка выполнить такой код напрямую в 1С вызовет синтаксическую ошибку разбора выражений.
Для обхода этого ограничения встроенного языка применим вспомогательный COM-объект MSScriptControl.ScriptControl, выполняющий присвоение через движок JavaScript.
Посмотрим на пример кода с отключением ошибки несовпадения имени:
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
// Инициализируем скриптовый движок для установки свойств COM-объекта
Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
Скрипт.Language = "javascript";
Скрипт.AddObject("WinHttp", WinHttp);
// Флаг 4096 (0x1000) игнорирует исключительно несовпадение имени узла (Cert Name Mismatch)
// Это сохраняет проверку подлинности доверенного центра CA
Скрипт.Eval("WinHttp.Option(4) = 4096");
Попытка
Адрес = "https://" + IPадрес + ":51401/api/v1/info";
WinHttp.Open("GET", Адрес, Ложь);
WinHttp.SetRequestHeader("Content-Type", "application/json");
WinHttp.SetRequestHeader("Accept", "application/json");
WinHttp.Send();
Результат = WinHttp.ResponseText;
Сообщить("Успешный ответ от ЕСМ: " + Результат);
Исключение
Сообщить("Ошибка при обращении к ПИоТ: " + ОписаниеОшибки());
КонецПопытки;
Рассмотрим подробнее используемые числовые маски параметра Option(4):
0x0100) — игнорировать неизвестный удостоверяющий центр (Unknown CA).0x1000) — игнорировать несовпадение доменного имени или IP-адреса с именем в сертификате (Cert Name Mismatches).0x2000) — игнорировать недействительную дату или истекший срок действия сертификата.0x3300) — суммарный флаг, отключающий абсолютно все проверки SSL-сертификата (256 + 512 + 4096 + 8192).Важное предостережение по безопасности: использование суммарного флага 13056 полностью отключает валидацию канала. Поскольку модуль ЕСМ при запросе информации может отдавать сервисные авторизационные данные для интеграции с Честным знаком, полное отключение проверок делает трафик уязвимым для атак перехвата в локальной сети. Рекомендуется установить корневой сертификат ESP CM CA в систему и передавать в Option(4) только значение 4096.
Ограничение архитектуры x64: компонент MSScriptControl.ScriptControl существует только в 32-разрядном варианте. Если клиентское приложение 1С или сервер 1С функционирует в 64-битной версии, создание этого объекта завершится ошибкой «Класс не зарегистрирован». В таком случае следует применять Решение 1 и Решение 2 либо использовать внешнюю утилиту (например, системный curl.exe) через запуск приложения.