Перевод инфраструктуры 1С на операционные системы семейства Linux (например, CentOS, Ubuntu или Astra Linux) часто сопровождается трудностями при работе с криптографией. Традиционные методы, работающие в Windows через COM-объекты и автоматический поиск провайдеров, в среде Linux требуют явного указания путей к библиотекам и замены механизмов взаимодействия с веб-сервисами. В этой статье мы подробно разберем, как инициализировать менеджер криптографии и адаптировать код для работы с внешними API (например, Диадок) без использования Windows-зависимых компонентов. При подготовке серверного окружения для такой миграции можно использовать пошаговое руководство по развертыванию инфраструктуры 1С на Astra Linux.
В ОС Windows конструктор объекта МенеджерКриптографии часто вызывается с пустыми параметрами, так как система сама определяет установленные криптопровайдеры. Под Linux такой подход не сработает — менеджер будет создан пустым или вызовет исключение. Проанализируем правильный синтаксис инициализации объекта.
Для корректной работы нам необходимо указать путь к библиотеке криптопровайдера. В случае с КриптоПро это библиотека libcapilite.so. Рассмотрим пример кода, который позволяет инициализировать менеджер:
// Путь к библиотеке может отличаться в зависимости от дистрибутива и версии КриптоПро
ПутьКБиблиотеке = "/opt/cprocsp/lib/amd64/libcapilite.so";
ТипПровайдера = 75; // Для алгоритмов ГОСТ Р 34.10-2001
МенеджерКриптографии1С = Новый МенеджерКриптографии("", ПутьКБиблиотеке, ТипПровайдера);
Важно обратить внимание на разрядность системы. Если вы используете 64-битную платформу 1С, библиотека обязательно должна подгружаться из каталога amd64. Для 32-битных систем путь будет содержать ia32.
Разберем частую ошибку: "Сертификат, связанный с закрытым ключом, указывает на модуль криптографии, отличный от текущего". Это происходит из-за несоответствия типа провайдера в коде 1С и алгоритма, по которому выпущен ваш сертификат. Если программная настройка криптографии вызывает затруднения, альтернативой может стать использовать роботов для автоматизации действий пользователя в интерфейсе.
Выясним основные отличия в типах:
Если при попытке подписания вы получаете ошибку о несовместимости, проверьте параметры сертификата. Скорее всего, вам нужно заменить 75 на 80 в конструкторе МенеджерКриптографии.
Многие готовые модули (например, 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-запросов для управляемых форм.
Теперь рассмотрим, как заменить метод Send из COM-объекта на штатную отправку запроса в 1С. Основная сложность здесь заключается в передаче тела запроса и заголовков. Посмотрим на пример реализации функции ВыполнитьЗапросAPI:
Функция ВыполнитьЗапросAPI(Соединение, Ресурс, Метод, Заголовки, ТелоЗапроса)
// Формируем запрос без указания полного URL (только путь ресурса)
// Ошибка 501 часто возникает, если в запрос по ошибке попадает префикс "https://"
Запрос = Новый HTTPЗапрос(Ресурс, Заголовки);
Если Метод = "POST" Тогда
Если ТипЗнч(ТелоЗапроса) = Тип("Строка") Тогда
// Отключаем Byte Order Mark (BOM), чтобы сервер корректно принял XML/JSON
NoBOM = ИспользованиеByteOrderMark.НеИспользовать;
Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8, NoBOM);
Иначе
Запрос.УстановитьТелоИзДвоичныхДанных(ТелоЗапроса);
КонецЕсли;
КонецЕсли;
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Возврат Ответ;
КонецФункции
Разберем важные моменты в этом коде:
УстановитьТелоИзСтроки по умолчанию может добавить невидимый символ BOM в начало потока. Многие веб-серверы не понимают этот символ и возвращают ошибку 400 Bad Request. Использование ИспользованиеByteOrderMark.НеИспользовать решает эту проблему.HTTPЗапрос нужно передавать только путь (например, /api/v1/method), а адрес сервера указывается только в HTTPСоединение.Content-Type (например, application/json или application/x-www-form-urlencoded).Даже если программный код написан верно, работа с криптографией может прерваться из-за ограничений операционной системы. Разберем шаги по проверке окружения: Для последующего технического обслуживания системы можно настроить автоматическое архивирование и тестирование баз.
usr1cv8. Убедитесь, что сертификаты установлены в хранилище именно этого пользователя (certmgr -list под учеткой 1С)./var/opt/cprocsp/keys/. Именно там КриптоПро хранит контейнеры закрытых ключей.ЗащищенноеСоединениеOpenSSL в системе должны быть установлены пакеты openssl и ca-certificates. 1С под Linux использует системные библиотеки для установки TLS-сессий.Таким образом, переход на Linux требует от разработчика более глубокого понимания параметров криптопровайдеров и отказа от устаревших Windows-технологий в пользу универсальных объектов платформы 1С. Использование штатных HTTPЗапрос и МенеджерКриптографии с явным указанием путей позволяет создать стабильно работающее решение для ЭДО и других систем, требующих использования электронной подписи.