В сфере интеграции систем, особенно при взаимодействии 1С с внешними SFTP-серверами для обмена файлами, мы часто сталкиваемся с необходимостью использовать сторонние компоненты, такие как WinSCP через его COM-объект. Однако, в процессе работы могут возникать специфические ошибки, требующие детального анализа. Одна из таких распространенных проблем — SSH host key fingerprint "Ключ" does not match pattern /((ssh-rsa|ssh-dss|ssh-ed25519|ecdsa-sha2-nistp(256|384|521.... Эта ошибка, как правило, проявляется после изменения конфигурации на стороне SFTP-сервера, например, при переходе на новые, более безопасные алгоритмы ключей. Рассмотрим проблему подробнее и выясним, как ее эффективно решить.
Сообщение об ошибке SSH host key fingerprint does not match pattern сигнализирует о том, что отпечаток SSH-ключа хоста, который мы пытаемся передать через параметр SshHostKeyFingerprint объекта SessionOptions, не соответствует ожидаемому формату. Библиотека WinSCP.NET (используемая COM-объектом) проводит строгую проверку этой строки на соответствие внутреннему регулярному выражению. Если формат строки не соответствует этому шаблону, операция прерывается с указанной ошибкой.
ssh-rsa на более современный ssh-ed25519. При этом меняется не только сам алгоритм генерации ключа, но и его представление в отпечатке. Старый отпечаток, даже если он был ранее успешно использован для ssh-rsa, становится недействительным для ed25519. Нам требуется новый отпечаток, специфичный для ed25519.ssh-rsa, ssh-ed25519), а также иметь разделители (двоеточия) или их отсутствие. WinSCP.NET ожидает строго определенный формат для параметра SshHostKeyFingerprint. Часто этот формат включает префикс типа ключа, затем, возможно, размер ключа, и само закодированное значение отпечатка, без двоеточий, например, ssh-ed25519 256 SHA256:fingerprint_value или просто ssh-ed25519 fingerprint_value. Важно понимать, что ручное преобразование или копирование из файла known_hosts не всегда приводит к корректному формату для COM-объекта WinSCP.WinSCP.SessionOptions, который является оберткой для .NET сборки WinSCP.NET. Это означает, что все требования к параметрам, включая формат отпечатка ключа, диктуются этой .NET сборкой. Поэтому универсальные методы получения отпечатка (например, через команду ssh-keygen или из файла known_hosts в формате OpenSSH) могут быть несовместимы напрямую с ожидаемым форматом WinSCP COM-объекта без дополнительного преобразования.Переход на Ed25519 является важным шагом в сторону повышения безопасности. Это современный алгоритм цифровой подписи, основанный на криптографии эллиптических кривых (ECC). Он обладает несколькими ключевыми преимуществами перед устаревшим ssh-rsa:
Ed25519 обеспечивает тот же уровень криптографической стойкости, что и RSA-ключи значительно большей длины (например, 3072 или 4096 бит), но при этом использует значительно меньшие ключи (256 бит). Это снижает риски, связанные с потенциальными уязвимостями или атаками на старые алгоритмы.Ed25519 обычно происходит быстрее, что может положительно сказаться на скорости установления соединения и обмена данными.Самый надежный и рекомендованный способ получить отпечаток ключа хоста в формате, который гарантированно примет WinSCP COM-объект, — это использовать встроенные функции графического интерфейса самой программы WinSCP. Мы проведем вас по шагам, чтобы вы могли самостоятельно получить правильное значение.
SFTP.ftp.mysklad.ru).22. Укажите его, если не было других инструкций.SshHostKeyFingerprint.SshHostKeyFingerprint. Она будет выглядеть примерно так (обратите внимание, что конкретное значение и его структура будут уникальными для вашего сервера):
// ... другие параметры
sessionOptions.SshHostKeyFingerprint = "ssh-ed25519 256:SHA256:BqD/1x...p9Y="; // Пример, ваше значение будет уникальным
// ... остальные параметры
sessionOptions.SshHostKeyFingerprint = "ssh-ed25519 256 BqD/1x...p9Y="; // Еще один пример
SshHostKeyFingerprint, включая кавычки и префикс типа ключа (например, ssh-ed25519). Это и есть тот самый корректный формат, который ожидает COM-объект.
Теперь, когда у нас есть правильно отформатированный отпечаток SSH-ключа, мы можем обновить ваш код в 1С. Ранее ваш код для инициализации параметров сессии выглядел примерно так:
sessionOptions = Новый COMОбъект("WinSCP.SessionOptions");
sessionOptions.HostName = ПутьFTP;
sessionOptions.UserName = Пользователь;
sessionOptions.PortNumber = PortNumber;
sessionOptions.SshHostKeyFingerprint = SshHostKeyFingerprint; // Здесь ранее возникала ошибка
// Дополнительные параметры, если есть
Вам необходимо заменить значение переменной SshHostKeyFingerprint (или жестко прописанное значение) на строку, которую вы скопировали из WinSCP GUI. Рассмотрим примеры обновления кода:
// Предыдущее значение переменной SshHostKeyFingerprint
// Например: ПеременнаяSshHostKeyFingerprint = "старое_ssh-rsa_значение";
// Обновляем переменную новым, корректным значением из WinSCP GUI
ПеременнаяSshHostKeyFingerprint = "ssh-ed25519 256:SHA256:BqD/1x...p9Y="; // Вставьте ваше скопированное значение
sessionOptions = Новый COMОбъект("WinSCP.SessionOptions");
sessionOptions.HostName = ПутьFTP;
sessionOptions.UserName = Пользователь;
sessionOptions.PortNumber = PortNumber;
sessionOptions.SshHostKeyFingerprint = ПеременнаяSshHostKeyFingerprint;
// ...
sessionOptions = Новый COMОбъект("WinSCP.SessionOptions");
sessionOptions.HostName = ПутьFTP;
sessionOptions.UserName = Пользователь;
sessionOptions.PortNumber = PortNumber;
sessionOptions.SshHostKeyFingerprint = "ssh-ed25519 256:SHA256:BqD/1x...p9Y="; // Вставьте ваше скопированное значение
// ...
После обновления кода и запуска его в 1С, ошибка SSH host key fingerprint does not match pattern должна быть устранена, и подключение к SFTP-серверу будет установлено успешно.
Мы должны помнить, что изменение ключей хоста на сервере — это стандартная практика обеспечения безопасности. При каждой такой смене WinSCP клиент (как графический, так и программный через COM-объект) должен быть обновлен с новым отпечатком.
SshHostKeyFingerprint при смене ключа на сервере. В противном случае, ваш скрипт перестанет работать. Возможно, стоит рассмотреть хранение этого параметра не в коде, а в параметрах, доступных для конфигурации, чтобы упростить его обновление без изменения программного кода.Таким образом, мы подробно рассмотрели проблему SSH host key fingerprint does not match pattern при работе с WinSCP COM-объектом в 1С. Выяснили, что причина кроется в строгих требованиях WinSCP к формату отпечатка ключа хоста и его изменении после обновления сервера на ed25519. Наиболее эффективное решение — использовать функцию "Generate session URL/code" в графическом интерфейсе WinSCP для получения корректно отформатированного отпечатка. Это позволяет обеспечить надежное и безопасное взаимодействие вашей системы 1С с внешними SFTP-серверами.