Как исправить ошибку WinHTTP: Имя узла в сертификате недопустимо либо не соответствует при обращении к ЕСМ (ПИоТ)?

Программист 1С v8.3 (Управляемые формы) Торговля и дистрибуция
← На главную

При организации взаимодействия учётной системы 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.

Решение 1. Правильная установка сертификатов ЕСМ в операционную систему

Разберем по шагам наиболее безопасный и системный способ устранения ошибки, не требующий отключения проверок безопасности в коде.

Корневой сертификат удостоверяющего центра модуля ЕСМ должен быть добавлен в доверенные хранилища как на машине с запущенным сервисом, так и на сервере RDP, откуда происходят обращения из 1С.

  1. На локальном компьютере кассы перейдем в каталог расположения сертификатов службы ЕСМ. По умолчанию файлы располагаются по пути: C:\ProgramData\ESP\ESM\um.
  2. Найдем файл корневого сертификата центра авторизации (обычно с именем ESP CM CA).
  3. Скопируем данный сертификат на сервер RDP.
  4. На сервере RDP откроем консоль управления сертификатами уровня компьютера (выполнив команду certlm.msc в командной строке или через окно «Выполнить»). Обратите внимание: крайне важно устанавливать сертификат именно в хранилище «Локальный компьютер», а не в хранилище текущего пользователя, чтобы все сеансы кассиров и фоновые задания имели к нему доступ.
  5. Импортируем сертификат в раздел «Доверенные корневые центры сертификации» (Trusted Root Certification Authorities).

После правильного размещения корневого сертификата система признает центр выдачи легитимным, и браузер перестанет выдавать предупреждение о неизвестном издателе.

Решение 2. Перегенерация сертификата службы ЕСМ на IPv4 или имя хоста

Даже при установленном корневом сертификате WinHTTP продолжит блокировать запросы, если в сертификате прописан IPv6-адрес, а подключение идет по IPv4. Рассмотрим, как заставить модуль выпустить корректный сертификат:

  1. На локальном компьютере кассира временно отключим протокол IPv6 в свойствах активного сетевого подключения (Ethernet / Wi-Fi).
  2. Остановим службу ЕСМ через оснастку управления службами Windows.
  3. Перезапустим службу (или проведем повторную инициализацию сетевых настроек модуля через его утилиту управления). При запуске служба пересоздаст рабочий SSL-сертификат, привязав его к сетевому имени компьютера (NetBIOS/FQDN) или активному IPv4-адресу.
  4. В конфигурационном файле hosts на сервере RDP (расположенном в C:\Windows\System32\drivers\etc\hosts) сопоставим IP-адрес кассового компьютера с его сетевым именем.
  5. В коде 1С укажем обращение не по голому IP, а по зарегистрированному имени: например, https://kassa1:51401/api/v1/info.

Решение 3. Обход проверки несовпадения имени узла в коде 1С через WinHTTP

Если сроки запуска не позволяют перенастраивать сетевые службы на десятках удаленных касс, можно скорректировать логику проверки в самом объекте 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):

  1. 256 (0x0100) — игнорировать неизвестный удостоверяющий центр (Unknown CA).
  2. 4096 (0x1000) — игнорировать несовпадение доменного имени или IP-адреса с именем в сертификате (Cert Name Mismatches).
  3. 8192 (0x2000) — игнорировать недействительную дату или истекший срок действия сертификата.
  4. 13056 (0x3300) — суммарный флаг, отключающий абсолютно все проверки SSL-сертификата (256 + 512 + 4096 + 8192).

Важное предостережение по безопасности: использование суммарного флага 13056 полностью отключает валидацию канала. Поскольку модуль ЕСМ при запросе информации может отдавать сервисные авторизационные данные для интеграции с Честным знаком, полное отключение проверок делает трафик уязвимым для атак перехвата в локальной сети. Рекомендуется установить корневой сертификат ESP CM CA в систему и передавать в Option(4) только значение 4096.

Ограничение архитектуры x64: компонент MSScriptControl.ScriptControl существует только в 32-разрядном варианте. Если клиентское приложение 1С или сервер 1С функционирует в 64-битной версии, создание этого объекта завершится ошибкой «Класс не зарегистрирован». В таком случае следует применять Решение 1 и Решение 2 либо использовать внешнюю утилиту (например, системный curl.exe) через запуск приложения.

← На главную