Как настроить работу с сертификатами и КриптоПро под Linux в 1С 8.3

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

Перевод инфраструктуры 1С на операционные системы семейства Linux (например, CentOS, Ubuntu или Astra Linux) часто сопровождается трудностями при работе с криптографией. Традиционные методы, работающие в Windows через COM-объекты и автоматический поиск провайдеров, в среде Linux требуют явного указания путей к библиотекам и замены механизмов взаимодействия с веб-сервисами. В этой статье мы подробно разберем, как инициализировать менеджер криптографии и адаптировать код для работы с внешними API (например, Диадок) без использования Windows-зависимых компонентов. При подготовке серверного окружения для такой миграции можно использовать пошаговое руководство по развертыванию инфраструктуры 1С на Astra Linux.

Инициализация МенеджераКриптографии под Linux

В ОС Windows конструктор объекта МенеджерКриптографии часто вызывается с пустыми параметрами, так как система сама определяет установленные криптопровайдеры. Под Linux такой подход не сработает — менеджер будет создан пустым или вызовет исключение. Проанализируем правильный синтаксис инициализации объекта.

Для корректной работы нам необходимо указать путь к библиотеке криптопровайдера. В случае с КриптоПро это библиотека libcapilite.so. Рассмотрим пример кода, который позволяет инициализировать менеджер:


// Путь к библиотеке может отличаться в зависимости от дистрибутива и версии КриптоПро
ПутьКБиблиотеке = "/opt/cprocsp/lib/amd64/libcapilite.so";
ТипПровайдера = 75; // Для алгоритмов ГОСТ Р 34.10-2001
МенеджерКриптографии1С = Новый МенеджерКриптографии("", ПутьКБиблиотеке, ТипПровайдера);

Важно обратить внимание на разрядность системы. Если вы используете 64-битную платформу 1С, библиотека обязательно должна подгружаться из каталога amd64. Для 32-битных систем путь будет содержать ia32.

Выбор типа криптопровайдера: ГОСТ 2001 vs ГОСТ 2012

Разберем частую ошибку: "Сертификат, связанный с закрытым ключом, указывает на модуль криптографии, отличный от текущего". Это происходит из-за несоответствия типа провайдера в коде 1С и алгоритма, по которому выпущен ваш сертификат. Если программная настройка криптографии вызывает затруднения, альтернативой может стать использовать роботов для автоматизации действий пользователя в интерфейсе.

Выясним основные отличия в типах:

  1. Тип 75: Предназначен для работы со старым стандартом ГОСТ Р 34.10-2001.
  2. Тип 80: Современный стандарт ГОСТ Р 34.10-2012 (длина ключа 256 бит). Большинство актуальных сертификатов сегодня используют именно его.
  3. Тип 81: Используется для усиленных ключей ГОСТ Р 34.10-2012 (512 бит).

Если при попытке подписания вы получаете ошибку о несовместимости, проверьте параметры сертификата. Скорее всего, вам нужно заменить 75 на 80 в конструкторе МенеджерКриптографии.

Замена COM-объектов на штатное HTTPСоединение

Многие готовые модули (например, EDI от Контура) изначально написаны под Windows и используют Microsoft.XMLHTTP или WinHttp.WinHttpRequest. В Linux поддержка COM-объектов отсутствует, поэтому нам необходимо переписать логику взаимодействия с сервером, используя объект HTTPСоединение. Рассмотрим, как это сделать правильно для работы по протоколу HTTPS.

Проанализируем ситуацию: при работе с защищенным соединением в Linux 1С требует явного использования объекта ЗащищенноеСоединениеOpenSSL. Посмотрим на реализацию функции создания соединения:


Функция ПолучитьСоединение(Сервер, Порт = 443)
    Прокси = Неопределено; // Настройте, если требуется
    
    // В Linux обязательно создаем защищенное соединение через OpenSSL
    Защита = Новый ЗащищенноеСоединениеOpenSSL();
    
    Попытка
        Соединение = Новый HTTPСоединение(Сервер, Порт, , , Прокси, , Защита);
        Возврат Соединение;
    Исключение
        ЗаписьЖурналаРегистрации("Ошибка соединения", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;
КонецФункции

Важный нюанс: при создании HTTPСоединение параметр ЗащищенноеСоединение является седьмым по счету в актуальных версиях платформы 8.3. Пропуск параметров или использование числа вместо объекта ЗащищенноеСоединениеOpenSSL приведет к ошибке или попытке соединения по обычному HTTP (что вызовет ошибку 400 Bad Request на стороне сервера). Для отладки и тестирования подобных запросов без использования COM-объектов пригодится консоль HTTP-запросов для управляемых форм.

Реализация POST-запроса к API

Теперь рассмотрим, как заменить метод Send из COM-объекта на штатную отправку запроса в 1С. Основная сложность здесь заключается в передаче тела запроса и заголовков. Посмотрим на пример реализации функции ВыполнитьЗапросAPI:


Функция ВыполнитьЗапросAPI(Соединение, Ресурс, Метод, Заголовки, ТелоЗапроса)
    // Формируем запрос без указания полного URL (только путь ресурса)
    // Ошибка 501 часто возникает, если в запрос по ошибке попадает префикс "https://"
    Запрос = Новый HTTPЗапрос(Ресурс, Заголовки);
    
    Если Метод = "POST" Тогда
        Если ТипЗнч(ТелоЗапроса) = Тип("Строка") Тогда
            // Отключаем Byte Order Mark (BOM), чтобы сервер корректно принял XML/JSON
            NoBOM = ИспользованиеByteOrderMark.НеИспользовать;
            Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8, NoBOM);
        Иначе
            Запрос.УстановитьТелоИзДвоичныхДанных(ТелоЗапроса);
        КонецЕсли;
    КонецЕсли;

    Ответ = Соединение.ОтправитьДляОбработки(Запрос);
    Возврат Ответ;
КонецФункции

Разберем важные моменты в этом коде:

  1. Отключение BOM: При передаче строк (XML или JSON) в теле запроса метод УстановитьТелоИзСтроки по умолчанию может добавить невидимый символ BOM в начало потока. Многие веб-серверы не понимают этот символ и возвращают ошибку 400 Bad Request. Использование ИспользованиеByteOrderMark.НеИспользовать решает эту проблему.
  2. Путь ресурса: В объект HTTPЗапрос нужно передавать только путь (например, /api/v1/method), а адрес сервера указывается только в HTTPСоединение.
  3. Заголовки: Убедитесь, что вы передаете актуальный Content-Type (например, application/json или application/x-www-form-urlencoded).

Права доступа и установка сертификатов

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

Таким образом, переход на Linux требует от разработчика более глубокого понимания параметров криптопровайдеров и отказа от устаревших Windows-технологий в пользу универсальных объектов платформы 1С. Использование штатных HTTPЗапрос и МенеджерКриптографии с явным указанием путей позволяет создать стабильно работающее решение для ЭДО и других систем, требующих использования электронной подписи.

← На главную