При интеграции 1С с внешними государственными или финансовыми сервисами (например, с Объединенным Кредитным Бюро — ОКБ) разработчики часто сталкиваются с проблемой: стандартный механизм 1С ЗащищенноеСоединениеOpenSSL не хочет работать с установленными сертификатами КриптоПро. В этой статье мы подробно разберем, почему это происходит, и рассмотрим наиболее надежные способы реализации такого соединения.
Для начала проанализируем ситуацию. Платформа 1С:Предприятие использует для защиты соединений библиотеки OpenSSL. Основная сложность заключается в том, что "из коробки" встроенный в 1С OpenSSL не поддерживает российские алгоритмы шифрования ГОСТ. Чтобы подружить 1С и КриптоПро через OpenSSL, требуется настройка специального модуля (Engine), что в операционной системе Windows реализовать технически крайне сложно.
Когда вы используете код типа:
СоединениеЗащита = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиента, СертификатУЦ);
HTTP = Новый HTTPСоединение(Сервер, , , , , , СоединениеЗащита);
1С пытается самостоятельно обработать сертификаты, не обращаясь к системным библиотекам Windows (Schannel), которые как раз и умеют работать с установленным в систему провайдером КриптоПро. В итоге сервер (например, test.rb-ei.com) возвращает ошибку об отсутствии пользовательского или корневого сертификата, так как 1С просто не смогла корректно передать их в зашифрованном канале.
Рассмотрим альтернативный и наиболее стабильный вариант — использование системного 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 могут возникнуть сложности. Выясним основные причины возможных сбоев:
WinHttp и искать 64-битные драйверы КриптоПро. Если сертификат виден в браузере (который часто 32-битный), но не подцепляется в 1С — проверьте соответствие разрядности.windows-1251 (ANSI). Если вы отправите XML в UTF-8 без соответствующего заголовка, сервер может отклонить запрос еще до проверки сертификата.Проанализируем ситуацию, когда нам категорически не удается заставить 1С работать с сертификатом напрямую. В этом случае профессиональное сообщество рекомендует использовать утилиту Stunnel. Это локальный прокси-сервер, который берет на себя всю работу по шифрованию.
Схема работы будет выглядеть так:
localhost:8080 и перенаправлять его как HTTPS с сертификатом на test.rb-ei.com:443.HTTPСоединение без всяких параметров защиты, обращаясь к localhost:8080.Этот метод считается самым "непробиваемым", так как он полностью изолирует криптографические сложности от кода 1С. Однако он требует дополнительной настройки системного ПО на сервере или рабочей станции.
Мы выяснили причину, по которой стандартные средства 1С могут не видеть сертификаты КриптоПро — это ограничение встроенного OpenSSL. Для решения задачи рекомендуем в первую очередь попробовать реализацию через WinHttp.WinHttpRequest.5.1, так как это решение не требует стороннего софта и опирается на системные механизмы Windows. Если же этот путь окажется слишком сложным из-за ограничений прав доступа или разрядности, использование Stunnel станет надежной альтернативой.