Как настроить работу со сторонними сервисами по HTTPS с использованием клиентского сертификата в 1С

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

Интеграция с банковскими сервисами, такими как МКБ для приема платежей по QR-кодам, часто требует настройки двухстороннего защищенного соединения (Mutual TLS). В этой схеме не только клиент проверяет сертификат сервера, но и сервер требует от клиента (вашей базы 1С) предъявить сертификат для подтверждения личности. Ошибка "Failure when receiving data from the peer" является классическим признаком того, что на этапе «рукопожатия» (SSL Handshake) возникли проблемы: либо сертификат не был предоставлен, либо он не прошел проверку на стороне сервера.

Рассмотрим подробно, как правильно настроить это взаимодействие, разберем типичные ошибки и проанализируем различные способы реализации в среде 1С:Предприятие.

Анализ исходного кода и типичных ошибок

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


стСтруктураДанныхJSON = Новый Структура;
// ... заполнение структуры данными ...

ЗаписьJSON = Новый ЗаписьJSON;
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, " ", Истина);  
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON); 
ЗаписатьJSON(ЗаписьJSON, стСтруктураДанныхJSON);
СтрокаJSON = ЗаписьJSON.Закрыть();

// Инициализация защищенного соединения
ssl = Новый ЗащищенноеСоединениеOpenSSL(
            Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Авто),
            Новый СертификатыУдостоверяющихЦентровWindows());   

HTTPСоединение = Новый HTTPСоединение("host", port,,,,, ssl);
Заголовки = Новый Соответствие;

запросPOST = Новый HTTPЗапрос("address", Заголовки); 
запросPOST.УстановитьТелоИзСтроки(СтрокаJSON, "utf-8", ИспользованиеByteOrderMark.НеИспользовать);

Ответ = HTTPСоединение.ОтправитьДляОбработки(запросPOST);

Проанализируем ситуацию: если в Postman запрос проходит успешно, а в 1С возникает ошибка Failure when receiving data from the peer, проблема чаще всего кроется не в сетевой доступности, а в контексте исполнения и цепочке доверия сертификата.

Решение 1: Проверка и установка полной цепочки сертификатов

Одной из самых частых причин отказа является отсутствие промежуточных или корневых сертификатов банка в хранилище доверенных лиц. Даже если клиентский сертификат установлен, 1С (через OpenSSL) должна иметь возможность проверить всю цепочку до доверенного корня.

Выполним следующие шаги для проверки:

  1. Откроем установленный сертификат в Windows (через оснастку certlm.msc для локального компьютера или certmgr.msc для пользователя).
  2. Перейдем на закладку "Путь сертификации". Если на каком-то этапе цепочки виден красный крестик или сообщение "Этот сертификат не удалось проверить", значит, цепочка не полная.
  3. Выясним, какой именно корневой сертификат использует банк. Обычно банки предоставляют его вместе с клиентским сертификатом.
  4. Установим корневой сертификат в хранилище "Доверенные корневые центры сертификации", а промежуточные — в "Промежуточные центры сертификации".

Важный момент: Если код 1С выполняется на сервере, сертификаты ОБЯЗАТЕЛЬНО должны быть установлены в хранилище "Локальный компьютер" (Local Machine), так как служба сервера 1С не имеет доступа к личному хранилищу вашей учетной записи пользователя.

Решение 2: Права доступа к закрытому ключу

Когда вы используете СертификатКлиентаWindows, 1С пытается обратиться к закрытому ключу сертификата. Если служба Агент сервера 1С:Предприятия запущена от имени системной учетной записи (например, USR1CV8), у этой учетной записи может не быть прав на чтение закрытого ключа.

Рассмотрим, как выдать права:

  1. Запустите оснастку управления сертификатами mmc (добавьте модуль "Сертификаты" для локального компьютера).
  2. Найдите ваш клиентский сертификат в разделе "Личное" -> "Реестр".
  3. Нажмите правой кнопкой мыши: Все задачи -> Управление закрытыми ключами (Manage Private Keys).
  4. Добавьте пользователя, под которым работает сервер 1С (например, USR1CV8 или LocalService), и дайте ему права на Чтение.

Решение 3: Особенности формата файла P12 и версии платформы

Если вы решите уйти от системного хранилища Windows и использовать файл напрямую через объект СертификатКлиентаФайл, вы можете столкнуться с несовместимостью алгоритмов шифрования.

Платформа 1С (особенно версии до 8.3.20) использует библиотеки OpenSSL, которые могут не поддерживать современные алгоритмы шифрования контейнеров .p12 или .pfx, созданных в OpenSSL 3.0. Если вы получаете ошибку при чтении файла, попробуйте перепаковать сертификат с использованием "Legacy" алгоритмов:

openssl pkcs12 -in original.p12 -out legacy.p12 -nodes -legacy

Затем в 1С используйте полученный файл:


Сертификат = Новый СертификатКлиентаФайл("D:\certificates\legacy.p12", "пароль");
ssl = Новый ЗащищенноеСоединениеOpenSSL(Сертификат, Новый СертификатыУдостоверяющихЦентровWindows());

Решение 4: Использование альтернативного метода через WinHTTP

Если штатный объект HTTPСоединение продолжает выдавать ошибки, специфичные для внутренней реализации OpenSSL в 1С, можно воспользоваться системным объектом WinHttp.WinHttpRequest.5.1. Этот метод работает более нативно для ОС Windows и часто "видит" сертификаты там, где 1С их теряет.

Рассмотрим пример реализации:


WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Open("POST", "https://bank-api-url.ru/api/v1/pay", Ложь);

// Указываем имя сертификата из хранилища (Subject)
// Или оставляем пустым, если нужно выбрать первый подходящий
WinHttp.SetClientCertificate("LOCAL_MACHINE\My\ИмяВашегоСертификата");

WinHttp.SetRequestHeader("Content-Type", "application/json");
WinHttp.Send(СтрокаJSON);

Статус = WinHttp.Status;
ОтветТекст = WinHttp.ResponseText;

Обратите внимание: Строка идентификации сертификата в методе SetClientCertificate может варьироваться в зависимости от настроек системы. Обычно используется формат LOCATION\STORE\SUBJECT.

Решение 5: Использование прокси-сервера Stunnel

В самых сложных случаях, когда 1С категорически не хочет принимать специфический банковский сертификат (например, из-за редких ГОСТ-алгоритмов или особенностей TLS-протокола), рекомендуется использовать Stunnel. Это внешняя утилита, которая создает локальный "туннель".

Схема работы будет выглядеть так:

  1. Stunnel слушает локальный порт (например, 8080) на сервере 1С.
  2. 1С отправляет обычный HTTP запрос на localhost:8080.
  3. Stunnel принимает этот запрос, "оборачивает" его в HTTPS, подкладывает клиентский сертификат и отправляет запрос в банк.

Конфигурация stunnel.conf может выглядеть следующим образом:


[bank_integration]
client = yes
accept = 127.0.0.1:8080
connect = api.bank.ru:443
cert = client_cert.pem
key = private_key.pem

В коде 1С при этом вы просто создаете соединение без объекта ЗащищенноеСоединениеOpenSSL на локальный адрес, что полностью исключает проблемы с SSL внутри платформы.

Резюме и рекомендации

Проанализировав ситуацию, можно сделать вывод, что наиболее вероятная причина ошибки — неполная цепочка доверия в системном хранилище или отсутствие прав у пользователя службы 1С на доступ к закрытому ключу. Перед изменением кода обязательно проверьте:

Использование ЗащищенноеСоединениеOpenSSL с параметрами СертификатКлиентаWindows и СертификатыУдостоверяющихЦентровWindows является наиболее современным и правильным подходом для платформы 8.3, при условии корректной настройки окружения операционной системы.

← На главную