Как исправить ошибку «Ошибка инициализации SSL-соединения» при работе с FTPS через FTPСоединение в 1С

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

При настройке защищенного обмена файлами по протоколу FTPS (FTP over SSL/TLS) разработчики часто сталкиваются с крайне коварной проблемой. Подключение к серверу с помощью объекта FTPСоединение проходит успешно, авторизация завершается без ошибок, и в целевом каталоге даже создается нужный файл. Однако в момент непосредственной передачи данных (при вызове методов Записать, Получить или Удалить) система аварийно завершает работу с ошибкой: «Ошибка работы с Интернет: ftp://ХХ.ХХ.ХХ.ХХ:21 Ошибка инициализации SSL-соединения». При этом созданный на сервере файл имеет размер 0 байт.

В этой статье мы подробно разберем физику этого процесса, выясним, почему файлы создаются пустыми, и рассмотрим по шагам все способы решения этой проблемы — как на стороне кода 1С, так и на стороне сетевых настроек и конфигурации FTP-сервера.

Почему файл создается, но его размер равен 0 байт?

Чтобы понять причину сбоя, давайте проанализировать архитектуру работы протокола FTP/FTPS. В отличие от большинства других протоколов (например, HTTP или SSH), FTP использует два независимых сетевых канала:

  1. Управляющий канал (Control Channel) — по умолчанию работает на порту 21. Через него клиент отправляет команды (авторизация, переход по каталогам, запрос на создание файла). При использовании FTPS этот канал успешно шифруется, 1С авторизуется на сервере и отправляет команду записи файла STOR. Сервер резервирует место под файл и создает его в файловой системе (именно поэтому мы видим файл размером 0 байт).
  2. Канал передачи данных (Data Channel) — открывается на динамическом (случайном) порту в пассивном режиме для непосредственной прокачки содержимого файла. И вот здесь, при попытке установить защищенное SSL-соединение для этого второго канала, происходит сбой. Так как данные передать не удается, 1С обрывает сессию, оставляя на сервере пустой «скелет» файла.

Давайте разберем основные причины, почему ломается шифрование на канале данных, и как это исправить.

Причина 1: Требование повторного использования SSL-сессии (SSL Session Reuse)

Это самая распространенная причина ошибки в современных реализациях защищенных FTP-серверов (таких как FileZilla Server, vsftpd, ProFTPD). В целях безопасности (для защиты от атак типа "Man-in-the-Middle" на канал данных) серверы по умолчанию требуют, чтобы SSL-сессия для канала данных **повторно использовала** параметры безопасности управляющего канала (так называемый механизм TLS Session Resumption или Session Reuse).

Платформа 1С:Предприятие (особенно на устаревших или промежуточных релизах) не всегда корректно отрабатывает повторное использование SSL-сессии при открытии нового TCP-сокета для передачи данных. Когда сервер требует подтвердить сессию, 1С пытается инициировать новое полноценное SSL-рукопожатие (Handshake). Сервер расценивает это как нарушение безопасности и закрывает соединение данных.

Решение на стороне FTP-сервера:

Если у вас или у ваших системных администраторов есть доступ к настройкам FTP-сервера, необходимо отключить требование обязательного переиспользования сессий TLS:

Причина 2: Блокировка пассивных портов брандмауэром или NAT (FTP ALG)

При работе по обычному незащищенному FTP межсетевые экраны используют специальный модуль — FTP ALG (Application Layer Gateway). Он анализирует трафик на порту 21, перехватывает команду пассивного режима PASV, узнает, какой порт сервер выделил для передачи данных, и автоматически временно открывает его на брандмауэре.

В случае с FTPS управляющий канал полностью зашифрован. Сетевое оборудование не может «заглянуть» внутрь пакетов и узнать, какой порт пассивного режима был согласован. В результате брандмауэр блокирует попытку 1С подключиться к порту данных, и соединение падает с ошибкой инициализации SSL.

Решение:

  1. На FTP-сервере необходимо жестко ограничить диапазон портов для пассивного режима (например, диапазон 50000-50100).
  2. Этот диапазон портов необходимо явно открыть (пробросить) во всех брандмауэрах, роутерах и сетевых экранах на пути от клиента 1С к серверу.

Причина 3: Некорректная настройка защищенного соединения в коде 1С

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

Рассмотрим правильный шаблон кода для создания отказоустойчивого FTPS-соединения:


// Шаг 1. Инициализируем защищенное соединение без строгой проверки цепочки сертификатов.
// Параметры Неопределено позволяют игнорировать ошибки самоподписанных сертификатов.
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(Неопределено, Неопределено);

// Шаг 2. Задаем параметры подключения
Сервер = "ХХ.42.ХХХ.Х"; // Указываем только IP или домен, без порта!
Порт = 21;              // Управляющий порт указывается отдельным числовым параметром
Логин = "MyFtpUser";
Пароль = "MySuperPassword";
Таймаут = 15;           // Увеличим таймаут, чтобы избежать ложных обрывов при медленном TLS Handshake

Попытка
    // Шаг 3. Создаем FTP-соединение.
    // Обратите внимание на последний параметр: явно требуем использование защищенного соединения
    FTPСоединение = Новый FTPСоединение(
        Сервер,
        Порт,
        Логин,
        Пароль,
        Неопределено, // Прокси не используем
        Истина,       // Обязательно Истина — пассивный режим работы
        Таймаут,
        ЗащищенноеСоединение,
        УровеньИспользованияЗащищенногоСоединенияFTP.Требовать
    );
    
    // Шаг 4. Выполняем запись файла
    ПутьКЛокальномуФайлу = "C:\Users\User\Desktop\log\Message.xml";
    ПутьНаСервере = "/testFolder/testClient.xml";
    
    FTPСоединение.Записать(ПутьКЛокальномуФайлу, ПутьНаСервере);
    
    Сообщить("Файл успешно передан по защищенному каналу!");
Исключение
    // Обработка ошибок и запись в Журнал регистрации для последующего анализа администраторами
    ЗаписьЖурналаРегистрации("ОбменДанными.FTPS",
        УровеньЖурналаРегистрации.Ошибка,
        , ,
        "Ошибка при передаче файла: " + ОписаниеОшибки());
    ВызватьИсключение;
КонецПопытки;

Причина 4: Устаревшая версия протокола TLS в операционной системе

Платформа 1С:Предприятие при работе под управлением ОС Windows использует системный компонент SChannel для инициализации защищенных соединений. Если FTP-сервер настроен на работу исключительно по современным протоколам (например, TLS 1.2 или TLS 1.3), а на сервере или компьютере, где запущена 1С (например, на старых версиях Windows Server 2008/2012), поддержка этих протоколов не включена на системном уровне, вы гарантированно получите ошибку инициализации SSL.

Решение:

Альтернативное решение: Переход на протокол SFTP с использованием внешних компонент

Если требования безопасности на стороне FTP-сервера запрещают отключать «SSL Session Reuse», а платформа 1С упорно отказывается устанавливать соединение данных, лучшим решением будет переход на протокол SFTP (SSH File Transfer Protocol).

Важно понимать разницу: FTPS — это старый FTP, «завернутый» в SSL-сертификаты с кучей проблем из-за двух разных каналов. SFTP — это принципиально другой протокол, работающий через SSH. Он использует всего один порт (по умолчанию 22) для управления и передачи данных, не требует повторного использования сессий SSL и без проблем проходит через любые NAT и брандмауэры.

Поскольку встроенный объект FTPСоединение в 1С не поддерживает протокол SFTP, для реализации обмена мы можем использовать бесплатную библиотеку WinSCP через механизм COM-соединения. Давайте посмотрим, как это реализовать:


Попытка
    // Инициализируем COM-объект WinSCP
    СессияWinSCP = Новый COMОбъект("WinSCP.Session");
    
    // Настраиваем параметры подключения
    ПараметрыПодключения = Новый COMОбъект("WinSCP.SessionOptions");
    ПараметрыПодключения.Protocol = 1; // Код 1 соответствует протоколу SFTP
    ПараметрыПодключения.HostName = "ХХ.42.ХХХ.Х";
    ПараметрыПодключения.PortNumber = 22; // Стандартный порт SSH/SFTP
    ПараметрыПодключения.UserName = "MyFtpUser";
    ПараметрыПодключения.Password = "MySuperPassword";
    
    // В реальных задачах здесь также указывается отпечаток SSH-ключа сервера для защиты от подмены:
    // ПараметрыПодключения.SshHostKeyFingerprint = "ssh-rsa 2048 xx:xx:xx...";
    
    // Открываем защищенную сессию
    СессияWinSCP.Open(ПараметрыПодключения);
    
    // Настраиваем параметры передачи
    ПараметрыПередачи = Новый COMОбъект("WinSCP.TransferOptions");
    ПараметрыПередачи.TransferMode = 0; // Бинарный режим передачи
    
    ЛокальныйФайл = "C:\Users\User\Desktop\log\Message.xml";
    УдаленныйКаталог = "/testFolder/testClient.xml";
    
    // Выполняем загрузку файла на сервер
    РезультатПередачи = СессияWinSCP.PutFiles(ЛокальныйФайл, УдаленныйКаталог, Ложь, ПараметрыПередачи);
    
    // Проверяем, не возникло ли ошибок во время передачи
    РезультатПередачи.Check();
    
    // Закрываем сессию и освобождаем ресурсы
    СессияWinSCP.Dispose();
    Сообщить("Файл успешно передан через надежный канал SFTP!");
Исключение
    Сообщить("Ошибка при работе с SFTP: " + ОписаниеОшибки());
КонецПопытки;

Подведем итоги

Если при попытке записать файл по FTPS в 1С вы получаете ошибку инициализации SSL, действуйте по следующему алгоритму:

  1. Проверьте код создания ЗащищенноеСоединениеOpenSSL — уберите жесткую проверку сертификатов и явно укажите уровень использования Требовать.
  2. Свяжитесь с администратором FTP-сервера и попросите его отключить требование SSL Session Reuse (повторное использование сессии TLS для канала данных). Это решает проблему в 90% случаев.
  3. Убедитесь, что на сетевом оборудовании открыт диапазон пассивных портов, используемый вашим FTP-сервером.
  4. Если победить FTPS не удается из-за жестких корпоративных политик безопасности, перенастройте обмен на использование протокола SFTP с помощью утилиты или COM-объекта WinSCP.
← На главную