При интеграции 1С с внешними веб-сервисами часто возникает необходимость использования Mutual TLS (mTLS) — протокола, при котором не только сервер подтверждает свою подлинность клиенту, но и клиент (1С) предъявляет свой сертификат серверу. Типичная проблема заключается в том, что при попытке автоматизировать этот процесс без участия пользователя разработчики сталкиваются с ошибками инициализации или отказом сервера принимать сертификат.
В этой статье мы подробно разберем, почему стандартный экспорт данных из справочника «Сертификаты ключей электронной подписи и шифрования» не всегда работает, и как правильно настроить объект ЗащищенноеСоединениеOpenSSL для стабильной работы в фоновом режиме.
Рассмотрим ситуацию, когда мы пытаемся инициализировать соединение через СпособВыбораСертификатаWindows.Авто. Проанализируем, как ведет себя платформа. Если код выполняется на стороне сервера (в фоновом задании или серверном модуле), 1С обращается к хранилищу сертификатов той учетной записи, под которой запущена служба Агент сервера 1С:Предприятия. Чаще всего это локальная системная учетная запись или специальный пользователь (например, USR1CV8), у которого просто нет доступа к личным сертификатам текущего пользователя Windows. Именно поэтому интерактивный выбор работает, а автоматический — нет.
Кроме того, для успешного «автоматического» подбора сертификат должен обладать определенным расширением Enhanced Key Usage (Улучшенный ключ), а именно — Client Authentication (1.3.6.1.5.5.7.3.2). Если это свойство отсутствует, 1С проигнорирует сертификат при автоматическом поиске.
Выясним причину, по которой простое сохранение данных из реквизита ДанныеСертификата справочника в файл не дает результата. В типовых конфигурациях 1С в этом реквизите хранится только публичная часть сертификата (обычно в формате .cer). Для установления защищенного соединения обязательно требуется наличие закрытого (приватного) ключа.
Когда мы используем метод ЗащищенноеСоединениеOpenSSL, передавая ему файл сертификата, OpenSSL ожидает найти там и публичный сертификат, и закрытый ключ. Если мы подкладываем только файл .cer, сервер логично отвечает: "No required SSL certificate was sent", так как 1С не смогла подписать данные для аутентификации из-за отсутствия ключа.
Для реализации программного подключения без диалоговых окон нам необходимо использовать объект СертификатКлиентаФайл. Рассмотрим шаги по подготовке данных:
.pfx (PKCS#12). Это можно сделать через оснастку certmgr.msc в Windows или через инструменты криптопровайдера (например, КриптоПро CSP). При экспорте обязательно установите пароль на файл.Проанализируем важный технический нюанс, упомянутый в обсуждении. В новых релизах платформы 1С используется современная версия библиотеки OpenSSL (3.x). Если ваш PFX-файл был экспортирован со старыми алгоритмами шифрования (например, RC2, которые часто используются Windows по умолчанию), вы получите ошибку digital envelope routines:EVP_PBE_CipherInit_ex:unknown pbe algorithm.
Решение: При создании PFX-файла с помощью утилиты OpenSSL используйте флаги для обеспечения совместимости или современные алгоритмы (AES256). Если вы используете командную строку:
openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -macalg SHA256 -keypbe AES-256-CBC -certpbe AES-256-CBC
Теперь рассмотрим, как собрать все элементы воедино в коде. Предположим, что у нас есть двоичные данные PFX-файла и пароль к нему. Разберем по шагам процесс создания соединения:
// 1. Подготовка временного файла для сертификата
ИмяФайлаСертификата = ПолучитьИмяВременногоФайла("pfx");
ДвоичныеДанныеPFX.Записать(ИмяФайлаСертификата);
// 2. Определение пароля (хранится в защищенном виде или константе)
ПарольСертификата = "ВашПароль123";
Попытка
// 3. Создание объекта сертификата клиента из файла
СертификатКлиента = Новый СертификатКлиентаФайл(ИмяФайлаСертификата, ПарольСертификата);
// 4. Инициализация защищенного соединения
// Параметр "СертификатыУдостоверяющихЦентров" можно оставить Неопределено,
// если используются системные сертификаты ОС
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиента);
// 5. Установка HTTP-соединения
HTTPСоединение = Новый HTTPСоединение(
АдресХоста,
443,
,,,
,
ЗащищенноеСоединение
);
// Выполнение запроса...
Запрос = Новый HTTPЗапрос("/api/v1/data");
Ответ = HTTPСоединение.Получить(Запрос);
Исключение
// Обязательно обрабатываем ошибки инициализации SSL
ЗаписьЖурналаРегистрации("SSL_Connection", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение;
КонецПопытки;
// 6. Очистка временных файлов
УдалитьФайлы(ИмяФайлаСертификата);
При реализации этого метода следует учитывать несколько ключевых моментов:
ПолучитьИмяВременногоФайла() на сервере, файл создается в профиле пользователя службы 1С.ЗащищенноеСоединениеOpenSSL может потребовать установленного криптопровайдера (КриптоПро CSP) и специальной настройки интеграции 1С с ним. В этом случае работа через СертификатКлиентаWindows на стороне сервера часто оказывается единственным вариантом, но она требует предварительной установки сертификата в хранилище «Локальный компьютер» (а не «Текущий пользователь»).Таким образом, мы выяснили, что для автоматической работы SSL-соединения в 1С критически важно предоставить платформе доступ к закрытому ключу через формат PFX и объект СертификатКлиентаФайл, а также обеспечить совместимость алгоритмов шифрования с актуальной версией OpenSSL.