При настройке защищенного обмена файлами по протоколу FTPS (FTP over SSL/TLS) разработчики часто сталкиваются с крайне коварной проблемой. Подключение к серверу с помощью объекта FTPСоединение проходит успешно, авторизация завершается без ошибок, и в целевом каталоге даже создается нужный файл. Однако в момент непосредственной передачи данных (при вызове методов Записать, Получить или Удалить) система аварийно завершает работу с ошибкой: «Ошибка работы с Интернет: ftp://ХХ.ХХ.ХХ.ХХ:21 Ошибка инициализации SSL-соединения». При этом созданный на сервере файл имеет размер 0 байт.
В этой статье мы подробно разберем физику этого процесса, выясним, почему файлы создаются пустыми, и рассмотрим по шагам все способы решения этой проблемы — как на стороне кода 1С, так и на стороне сетевых настроек и конфигурации FTP-сервера.
Чтобы понять причину сбоя, давайте проанализировать архитектуру работы протокола FTP/FTPS. В отличие от большинства других протоколов (например, HTTP или SSH), FTP использует два независимых сетевых канала:
STOR. Сервер резервирует место под файл и создает его в файловой системе (именно поэтому мы видим файл размером 0 байт).Давайте разберем основные причины, почему ломается шифрование на канале данных, и как это исправить.
Это самая распространенная причина ошибки в современных реализациях защищенных FTP-серверов (таких как FileZilla Server, vsftpd, ProFTPD). В целях безопасности (для защиты от атак типа "Man-in-the-Middle" на канал данных) серверы по умолчанию требуют, чтобы SSL-сессия для канала данных **повторно использовала** параметры безопасности управляющего канала (так называемый механизм TLS Session Resumption или Session Reuse).
Платформа 1С:Предприятие (особенно на устаревших или промежуточных релизах) не всегда корректно отрабатывает повторное использование SSL-сессии при открытии нового TCP-сокета для передачи данных. Когда сервер требует подтвердить сессию, 1С пытается инициировать новое полноценное SSL-рукопожатие (Handshake). Сервер расценивает это как нарушение безопасности и закрывает соединение данных.
Решение на стороне FTP-сервера:
Если у вас или у ваших системных администраторов есть доступ к настройкам FTP-сервера, необходимо отключить требование обязательного переиспользования сессий TLS:
/etc/vsftpd.conf и установите параметр:
require_ssl_reuse=NO
После этого обязательно перезапустите службу vsftpd.
TLSOptions NoSessionReuseRequired
При работе по обычному незащищенному FTP межсетевые экраны используют специальный модуль — FTP ALG (Application Layer Gateway). Он анализирует трафик на порту 21, перехватывает команду пассивного режима PASV, узнает, какой порт сервер выделил для передачи данных, и автоматически временно открывает его на брандмауэре.
В случае с FTPS управляющий канал полностью зашифрован. Сетевое оборудование не может «заглянуть» внутрь пакетов и узнать, какой порт пассивного режима был согласован. В результате брандмауэр блокирует попытку 1С подключиться к порту данных, и соединение падает с ошибкой инициализации SSL.
Решение:
50000-50100).Давайте проанализируем, как правильно написать инициализацию объекта в 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",
УровеньЖурналаРегистрации.Ошибка,
, ,
"Ошибка при передаче файла: " + ОписаниеОшибки());
ВызватьИсключение;
КонецПопытки;
Платформа 1С:Предприятие при работе под управлением ОС Windows использует системный компонент SChannel для инициализации защищенных соединений. Если FTP-сервер настроен на работу исключительно по современным протоколам (например, TLS 1.2 или TLS 1.3), а на сервере или компьютере, где запущена 1С (например, на старых версиях Windows Server 2008/2012), поддержка этих протоколов не включена на системном уровне, вы гарантированно получите ошибку инициализации SSL.
Решение:
HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client (параметр Enabled должен быть равен 1).
Если требования безопасности на стороне 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, действуйте по следующему алгоритму:
ЗащищенноеСоединениеOpenSSL — уберите жесткую проверку сертификатов и явно укажите уровень использования Требовать.