Как настроить соединение из 1С с использованием сертификатов КриптоПро для работы с ГОСТ-шифрованием

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

При интеграции 1С с внешними государственными или финансовыми сервисами (например, с Объединенным Кредитным Бюро — ОКБ) разработчики часто сталкиваются с проблемой: стандартный механизм 1С ЗащищенноеСоединениеOpenSSL не хочет работать с установленными сертификатами КриптоПро. В этой статье мы подробно разберем, почему это происходит, и рассмотрим наиболее надежные способы реализации такого соединения.

Почему стандартный метод 1С часто не работает с КриптоПро?

Для начала проанализируем ситуацию. Платформа 1С:Предприятие использует для защиты соединений библиотеки OpenSSL. Основная сложность заключается в том, что "из коробки" встроенный в 1С OpenSSL не поддерживает российские алгоритмы шифрования ГОСТ. Чтобы подружить 1С и КриптоПро через OpenSSL, требуется настройка специального модуля (Engine), что в операционной системе Windows реализовать технически крайне сложно.

Когда вы используете код типа:


СоединениеЗащита = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиента, СертификатУЦ);
HTTP = Новый HTTPСоединение(Сервер, , , , , , СоединениеЗащита);

1С пытается самостоятельно обработать сертификаты, не обращаясь к системным библиотекам Windows (Schannel), которые как раз и умеют работать с установленным в систему провайдером КриптоПро. В итоге сервер (например, test.rb-ei.com) возвращает ошибку об отсутствии пользовательского или корневого сертификата, так как 1С просто не смогла корректно передать их в зашифрованном канале.

Решение проблемы через использование объекта WinHttp

Рассмотрим альтернативный и наиболее стабильный вариант — использование системного COM-объекта WinHttp.WinHttpRequest.5.1. В отличие от механизмов 1С, этот объект является частью Windows и умеет использовать системное хранилище сертификатов и установленный КриптоПро напрямую. Это именно то, что в сообщениях форума предлагали как "человеческий способ" решения задачи.

Разберем по шагам, как реализовать отправку POST-запроса с сертификатом через WinHttp:

Шаг 1. Поиск отпечатка сертификата. Прежде чем писать код, нам нужно узнать отпечаток (Thumbprint) нашего сертификата. Его можно найти в свойствах сертификата через консоль КриптоПро CSP или оснастку certmgr.msc. Это строка из 40 символов (например, "a1 b2 c3...").

Шаг 2. Написание кода в 1С. Рассмотрим пример реализации:


// Создаем объект WinHttp
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");

// Инициализируем запрос: метод POST, URL сервера, асинхронность - Ложь
WinHttp.Open("POST", "https://test.rb-ei.com/cpuEnquiry.asp", Ложь);

// Устанавливаем сертификат по его имени (Subject) или отпечатку.
// Важно: КриптоПро должен быть корректно установлен, а сертификат привязан к ключу.
WinHttp.SetCertificate("Subject: Ваше Имя Организации или Отпечаток");

// Настройка заголовков
WinHttp.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
WinHttp.SetRequestHeader("Connection", "Keep-Alive");

// Если работаем с тестовым сервером, где могут быть проблемы с цепочкой доверия,
// можно заставить WinHttp игнорировать ошибки сертификатов (Option 4)
// 13056 = игнорировать все ошибки (не рекомендуется для продакшна!)
WinHttp.Option(4, 13056);

// Читаем данные из файла для отправки
ТекстЗапроса = Новый ТекстовыйДокумент;
ТекстЗапроса.Прочитать("D:\Запрос шифр.txt", КодировкаТекста.ANSI);
ТелоЗапроса = ТекстЗапроса.ПолучитьТекст();

// Отправляем запрос
Попытка
    WinHttp.Send(ТелоЗапроса);
    ОтветТекст = WinHttp.ResponseText;
    Статус = WinHttp.Status;
Исключение
    Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;

Важные технические нюансы

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

  1. Разрядность платформы (x86 vs x64). Если ваша 1С запущена как 64-битный процесс, она будет пытаться вызвать 64-битную версию WinHttp и искать 64-битные драйверы КриптоПро. Если сертификат виден в браузере (который часто 32-битный), но не подцепляется в 1С — проверьте соответствие разрядности.
  2. Доступ к закрытому ключу. Даже если сертификат установлен, у пользователя, под которым запущен процесс 1С (особенно если код выполняется на сервере), должны быть права на доступ к контейнеру закрытого ключа на USB-токене или в реестре.
  3. Настройка TLS в КриптоПро. Убедитесь, что в настройках КриптоПро CSP включена поддержка протокола TLS. Без этого системный Schannel не сможет использовать ГОСТ-алгоритмы для построения защищенного канала.
  4. Специфика ОКБ. Серверы ОКБ крайне требовательны к кодировке. Обычно это windows-1251 (ANSI). Если вы отправите XML в UTF-8 без соответствующего заголовка, сервер может отклонить запрос еще до проверки сертификата.

Альтернативный метод: Использование Stunnel

Проанализируем ситуацию, когда нам категорически не удается заставить 1С работать с сертификатом напрямую. В этом случае профессиональное сообщество рекомендует использовать утилиту Stunnel. Это локальный прокси-сервер, который берет на себя всю работу по шифрованию.

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

  1. На компьютере с 1С устанавливается Stunnel с поддержкой ГОСТ.
  2. В конфиге Stunnel прописывается маршрут: принимать обычный HTTP на localhost:8080 и перенаправлять его как HTTPS с сертификатом на test.rb-ei.com:443.
  3. В коде 1С вы используете обычное HTTPСоединение без всяких параметров защиты, обращаясь к localhost:8080.

Этот метод считается самым "непробиваемым", так как он полностью изолирует криптографические сложности от кода 1С. Однако он требует дополнительной настройки системного ПО на сервере или рабочей станции.

Заключение

Мы выяснили причину, по которой стандартные средства 1С могут не видеть сертификаты КриптоПро — это ограничение встроенного OpenSSL. Для решения задачи рекомендуем в первую очередь попробовать реализацию через WinHttp.WinHttpRequest.5.1, так как это решение не требует стороннего софта и опирается на системные механизмы Windows. Если же этот путь окажется слишком сложным из-за ограничений прав доступа или разрядности, использование Stunnel станет надежной альтернативой.

← На главную