michaellukashov / Far-NetBox

SFTP/SCP/FTP/FTPS/WebDAV/S3 client for Far Manager 3 (http://farmanager.com/)
https://forum.farmanager.com/viewtopic.php?t=6317
GNU General Public License v2.0
158 stars 52 forks source link

проблема с ssl_session_reuse: дисконнекты и падение фара #266

Open throwable-one opened 6 years ago

throwable-one commented 6 years ago

На линуксе OpenSSL 1.0.2k 26 Jan 2017, такой же как у вас как я понимаю. vsftpd, включен implicit tls и эта опция:

require_ssl_reuse
If set to yes, all SSL data connections are required to exhibit SSL session reuse (which proves that they know the same master secret as the control channel). Although this is a secure default, it may break many FTP clients, so you may want to disable it. For a discussion of the consequences, see     http://scarybeastsecurity.blogspot.com/2009/02/vsftpd-210-released.html (Added in v2.1.0).
Default: YES

Стоит по умолчанию. При отключенном session reuse в FAR падение, при включенном постояные дисконнекты. TotalCommander работает нормально.

Если отключить опцию в Far и vsftpd то всё ОК! А иначе

Exception thrown at 0x000007FEFD19A06D in Far.exe: Microsoft C++ exception: ESshFatal at memory location 0x000000000027B2B8.
Exception thrown at 0x000007FEFD19A06D in Far.exe: Microsoft C++ exception: [rethrow] at memory location 0x0000000000000000.
Exception thrown at 0x000007FEFD19A06D in Far.exe: Microsoft C++ exception: ESshFatal at memory location 0x000000000027B2B8.

Я правильно понимаю что в release версии без символов я много не надебажу? Если ни у кого не репродюсится, то могу попробовать собрать у себя и подебажить (соберется 2015й студией?) но попробуйте срепродьсить, мне кажется что у вас тоже получится.

До этого момента отразите пожалуйста этот факт в документации (ну или в комментарии к опции) потому что vsftpd из коробки имеет эту опцию, и у людей будет не работать implicit ssl с самым популярным линуксовым FTP:( Особенно обидно что Total работает, значит проблема решаема в принципе.

Если хотите -- скину на почту креденшелы сервера где я это срепродьюсил

throwable-one commented 6 years ago

собрался я дебагом, похоже что падает в FileZilla

FtpFileSystem.cpp::GotReply и Reply равен 4100

Disconnected стал True вот тут:

/ REPLY_NOTCONNECTED happens if connection is closed between moment // when FZAPI interface method dispatches the command to FZAPI thread // and moment when FZAPI thread receives the command bool Disconnected = FLAGSET(Reply, TFileZillaIntf::REPLY_DISCONNECTED) || FLAGSET(Reply, TFileZillaIntf::REPLY_NOTCONNECTED);

Вот стек

NetBox.dll!TTerminal::FatalError(Exception * E, const UnicodeString & Msg, const UnicodeString & HelpKeyword) Line 2409 C++
NetBox.dll!TFTPFileSystem::GotReply(unsigned __int64 Reply, unsigned __int64 Flags, const UnicodeString & Error, unsigned __int64 * Code, TStrings * * Response) Line 3764  C++
NetBox.dll!TFTPFileSystem::DoReadDirectory(TRemoteFileList * FileList) Line 2601    C++
NetBox.dll!TFTPFileSystem::ReadDirectory(TRemoteFileList * FileList) Line 2813  C++
NetBox.dll!TTerminal::CustomReadDirectory(TRemoteFileList * AFileList) Line 3110    C++
NetBox.dll!TTerminal::ReadDirectory(bool ReloadOnly, bool ForceCache) Line 3014 C++
NetBox.dll!TTerminal::ReactOnCommand(__int64 Cmd) Line 1836 C++
NetBox.dll!TTerminal::RemoteChangeDirectory(const UnicodeString & Directory) Line 4447  C++

FileZilla правда 2007 года? Может быть её обновить?

VictorVG commented 6 years ago

По первому вопросу о сборке - тут всё просто возьмите у меня Far-NetBox_bldtoold.tar.xz и в итоге PDB будут. В крайнем случае поправить зовущиеся из FreeBSD rm. Зачем с IDE возится коли из консоли всё прекрасно собирается?

По второму - начиная с версии NetBox 2.4.2.475 от 24.03.2017 входящие в него исходники OpenSSL обновлены до ветки 1.1.0, а та на уровне API не совместима с ветками 0.9.х - 1.0.2 - OpenSSL changelog, что гарантирует проблемы ссовместимости "NetBox - OpenSSL". Разработчики OpenSSL для её решения рекомендуют использовать параллельную установку тулкита веток 1.0.2 и 1.1.0 в разные каталоги, что позволит приложениям использовать свои версии библиотек (имена бинарников у них различаются).

По поводу системных требований Total Commander кроме требований к ОС Гислер ничего не говорит, но учитывая что он поддерживает совместимость ТС с максимально широким спектром версий ОС начиная от Windows 3.1 (16 бит) и Windows NT 3.51 до Windows 10 (32/64 бит), а так же отсутсвие в его бинарниках прямых вызовов OpenSSL я думаю что скорее всего он через ShellExecute() использует подмножество вызовов ветки 0.9.x - 1.0.2 (LTS, Long Time Support) так как требующие минимум Windows XP бинарники вертки 1.1.0 не совместимы с Win 9x/ME, NT 3.51/4, 2000, а Гислер декларирует поддержку данных ОС:

Q: Which operating systems are supported? A: There are 3 versions of Total Commander: 32 bit, 64 bit, and 16 bit.

  1. The 32 bit version runs on Windows 95, 98, ME, Windows NT 3.51/4.0, Windows 2000, Windows XP, Windows Vista, Windows 7, 8, 8.1 and 10 - on both the 32-bit and 64-bit operating systems. It also runs on the server versions based on these Windows versions.
  2. The 64 bit version runs on Windows XP, Vista, 7, 8, 8.1 and 10 64bit, and on the corresponding server versions.
  3. The 16 bit version runs on Windows 3.1.
throwable-one commented 6 years ago

Спасибо, правда я уже собрался студией из тага v2.4.3.512-far3 и получил эту проблему.

Возможно что проблема не в OpenSSL, а в коде, портированном FileZilla. Я всё таки надеюсь что автор посмотрит, потому что боюсь что я долго буду разбираться:(

Интересно, почему Гислер использует OpenSSL а не поддержку Windows Secure Sockets

VictorVG commented 6 years ago

А почему он до сих пор поддерживает Дайтону? Он по сему поводу молчит. А проблему вы получили на OpenSSL и я вам показал где. Ладно, пойду свой гит чинить - домашние "помогли".:)

throwable-one commented 6 years ago

@VictorVG Всё, я вас понял: если это правда проблема коммуникции моего линуксового OpenSSL (Кстати, он обновился до 1.0.2n) и нетбоксового 1.1.0g то в "идеальном" мире Far должен предлагать на выбор две разные версии OpenSSL, но тогда придется учить плагин работать с обеими версиями либо запускать openssl отдельно как это (вероятно) делает TC.

Странно что две версии openssl не могут договориться, возможно бага вообще где-то в неправильном использовании session reuse, а может нужно обновить openssl до 1.1.0h :)

Но вообще хотелось бы конечно внимания автора плагина, я думаю он лучше разберется

VictorVG commented 6 years ago

проблема в том, что у вас стоит только старая ветка OpenSSL, и решение описано в паре фраз:

August 29, 2016 - OpenSSL 1.1.0 is quite different from previous releases. Users should install BOTH the 1.0.2 series (LTS) and the 1.1.0 series for maximum application compatibility. Developers need to recompile their software to support 1.1.0. See the official OpenSSL release strategy document for more details..

Я у себя на демоне давно поднял OpenSSL 1.0.2 и параллельно 1.1.0 - всё работает из портов.