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

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

При разработке интеграций часто возникает задача организовать защищенное соединение (TLS) в контексте сервера 1С, например, для работы регламентных заданий. Основная сложность заключается в том, что механизмы, привычно работающие в тонком клиенте, выдают ошибки на сервере из-за различий в контексте исполнения и доступности системных перечислений. Разберем подробно, как правильно настроить ЗащищенноеСоединениеOpenSSL для работы на стороне сервера. Для предварительной отладки и проверки веб-сервисов можно использовать инструмент для тестирования REST API в среде 1С.

Проблема использования контекста клиента на сервере

Рассмотрим стандартную конструкцию, которую часто пытаются применить разработчики:


ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(
    Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Авто),
    Новый СертификатыУдостоверяющихЦентровWindows()
);

Проанализируем ситуацию: системное перечисление СпособВыбораСертификатаWindows доступно исключительно в контексте клиента. При попытке выполнить этот код в серверном модуле или в регламентном задании, система выдаст ошибку. Однако просто убрать параметр — не всегда достаточно, так как для TLS-соединения с двусторонней аутентификацией серверу внешнего ресурса критически важно получить валидный клиентский сертификат.

Метод 1. Автоматический подбор сертификата из хранилища Windows

Выясним, как работает автоматический подбор. Если мы создаем объект СертификатКлиентаWindows без параметров, 1С пытается самостоятельно найти подходящий сертификат в системном хранилище. Посмотрим на пример кода, который будет валиден для сервера:


// На сервере параметры выбора не указываются
СертификатКлиента = Новый СертификатКлиентаWindows(); 
ДоверенныеУЦ = Новый СертификатыУдостоверяющихЦентровWindows();

ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиента, ДоверенныеУЦ);

// Пример использования в HTTPСоединении
Соединение = Новый HTTPСоединение(
    "api.external-service.ru",,,, , , 
    ЗащищенноеСоединение
);

Важный нюанс: Чтобы эта конструкция заработала на сервере, сертификат должен быть установлен в хранилище "Личное" (My) той учетной записи, от имени которой запущена служба 1С (обычно это usr1cv8). Если сертификат установлен под вашей учетной записью администратора, сервер 1С его "не увидит".

Для настройки выполним следующие шаги:

  1. Зайдем на сервер под учетной записью службы 1С (или воспользуемся утилитами импорта сертификатов в конкретный профиль).
  2. Установим сертификат с закрытым ключом в хранилище "Текущий пользователь" -> "Личное".
  3. Проверим, что цепочка сертификатов (корневые и промежуточные) также установлена и доверена.

Метод 2. Использование сертификата из файла (PFX/PKCS12)

Если нет возможности или желания работать с системным хранилищем Windows, проанализируем использование файла сертификата. Этот метод считается более переносимым и часто используется в Linux-окружениях или при строгих политиках безопасности.

Рассмотрим программную реализацию:


ПутьКФайлу = "C:\Certificates\client_cert.pfx";
ПарольКФайлу = "YourStrongPassword";

// Создаем объект сертификата из файла PFX
СертификатИзФайла = Новый СертификатКлиентаФайл(ПутьКФайлу, ПарольКФайлу);
ДоверенныеУЦ = Новый СертификатыУдостоверяющихЦентровWindows();

ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(СертификатИзФайла, ДоверенныеУЦ);

При использовании этого метода разберем основные причины возможных неудач:

Метод 3. Настройка доверия к удостоверяющим центрам

Часто ошибка "Ошибка инициализации SSL-соединения" возникает не из-за клиентского сертификата, а из-за того, что сервер 1С не доверяет сертификату удаленного сервера. Для решения этой задачи на платформе Windows начиная с версии 8.3.8 эффективно использовать объект СертификатыУдостоверяющихЦентровОС.


// Использование системных сертификатов ОС для проверки доверия
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(
    Неопределено, // Если клиентский сертификат не требуется
    Новый СертификатыУдостоверяющихЦентровОС()
);

Если вы работаете на ОС Linux, необходимо явно указывать файл с корневыми сертификатами в формате PEM:


// Для Linux серверов
ДоверенныеУЦ = Новый СертификатыУдостоверяющихЦентровФайл("/etc/ssl/certs/ca-certificates.crt");
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, ДоверенныеУЦ);

Диагностика прав на закрытый ключ

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

Даже если сертификат виден в списке, служба 1С может не иметь прав на чтение его секретной части. Выполним настройку прав:

  1. Откройте оснастку mmc, добавьте модуль "Сертификаты" для учетной записи компьютера.
  2. Найдите ваш сертификат в разделе "Личное".
  3. Нажмите правую кнопку мыши -> "Все задачи" -> "Управление закрытыми ключами" (Manage Private Keys).
  4. Добавьте пользователя, под которым работает сервер (например, usr1cv8), и предоставьте ему права на "Чтение".

Проверка версий TLS

Иногда проблема кроется в несовместимости версий протокола. Современные веб-серверы требуют TLS 1.2 или 1.3. Платформа 1С:Предприятие реализует поддержку протоколов в зависимости от версии:

Если внешнее соединение требует специфических настроек шифрования, которые не удается прокинуть через ЗащищенноеСоединениеOpenSSL, можно рассмотреть альтернативу через COM-объект WinHttp.WinHttpRequest.5.1. Он позволяет более гибко управлять системными настройками Windows HTTP, включая явный выбор сертификата по его отпечатку (Thumbprint), что бывает полезно в сложных серверных сценариях.

Итоги

Мы проанализировали основные способы реализации защищенного соединения на сервере 1С. Подведем итог: для регламентных заданий наиболее стабильным решением является использование Новый СертификатКлиентаWindows() (без параметров) при условии предварительной установки сертификата в профиль пользователя службы 1С и настройки прав доступа к закрытому ключу. Если же инфраструктура подразумевает частую смену серверов, оптимальным выбором станет использование СертификатКлиентаФайл с хранением PFX-контейнера в защищенном сетевом каталоге или внутри тома данных сервера.

← На главную