Как программно установить защищенное SSL-соединение с использованием сертификата клиента из справочника 1С

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

При интеграции 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С проигнорирует сертификат при автоматическом поиске.

Разбор ошибки: CER против PFX

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

Когда мы используем метод ЗащищенноеСоединениеOpenSSL, передавая ему файл сертификата, OpenSSL ожидает найти там и публичный сертификат, и закрытый ключ. Если мы подкладываем только файл .cer, сервер логично отвечает: "No required SSL certificate was sent", так как 1С не смогла подписать данные для аутентификации из-за отсутствия ключа.

Правильная подготовка файла сертификата (PFX)

Для реализации программного подключения без диалоговых окон нам необходимо использовать объект СертификатКлиентаФайл. Рассмотрим шаги по подготовке данных:

  1. Экспорт сертификата с закрытым ключом: Вам необходимо получить файл в формате .pfx (PKCS#12). Это можно сделать через оснастку certmgr.msc в Windows или через инструменты криптопровайдера (например, КриптоПро CSP). При экспорте обязательно установите пароль на файл.
  2. Загрузка в 1С: Чтобы решение было универсальным, вы можете хранить этот PFX-файл либо в специальном томе на диске, доступном серверу 1С, либо в справочнике «Присоединенные файлы», связанном с вашим элементом справочника сертификатов.

Проблема совместимости OpenSSL 3.0 (Ошибка "unknown pbe algorithm")

Проанализируем важный технический нюанс, упомянутый в обсуждении. В новых релизах платформы 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

Программная реализация на стороне 1С

Теперь рассмотрим, как собрать все элементы воедино в коде. Предположим, что у нас есть двоичные данные PFX-файла и пароль к нему. Разберем по шагам процесс создания соединения:


// 1. Подготовка временного файла для сертификата
ИмяФайлаСертификата = ПолучитьИмяВременногоФайла("pfx");
ДвоичныеДанныеPFX.Записать(ИмяФайлаСертификата);

// 2. Определение пароля (хранится в защищенном виде или константе)
ПарольСертификата = "ВашПароль123";

Попытка
    // 3. Создание объекта сертификата клиента из файла
    СертификатКлиента = Новый СертификатКлиентаФайл(ИмяФайлаСертификата, ПарольСертификата);
    
    // 4. Инициализация защищенного соединения
    // Параметр "СертификатыУдостоверяющихЦентров" можно оставить Неопределено, 
    // если используются системные сертификаты ОС
    ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиента);
    
    // 5. Установка HTTP-соединения
    HTTPСоединение = Новый HTTPСоединение(
        АдресХоста, 
        443, 
        ,,, 
        , 
        ЗащищенноеСоединение
    );
    
    // Выполнение запроса...
    Запрос = Новый HTTPЗапрос("/api/v1/data");
    Ответ = HTTPСоединение.Получить(Запрос);
    
Исключение
    // Обязательно обрабатываем ошибки инициализации SSL
    ЗаписьЖурналаРегистрации("SSL_Connection", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
    ВызватьИсключение;
КонецПопытки;

// 6. Очистка временных файлов
УдалитьФайлы(ИмяФайлаСертификата);

Важные замечания по безопасности и архитектуре

При реализации этого метода следует учитывать несколько ключевых моментов:

Таким образом, мы выяснили, что для автоматической работы SSL-соединения в 1С критически важно предоставить платформе доступ к закрытому ключу через формат PFX и объект СертификатКлиентаФайл, а также обеспечить совместимость алгоритмов шифрования с актуальной версией OpenSSL.

← На главную