Сделайте FTPS соединение в Ruby с гемом double-bag-ftps - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь заставить работать собственное FTP-соединение с нечетным FTP-сервером в ruby.Требуется TLS и неявный SSL.У меня настроен и работает клиент FileZilla.Вот мой код:

require 'double_bag_ftps'

DoubleBagFTPS.open(ftp_host, ftp_user, passwd, nil, DoubleBagFTPS::IMPLICIT, :verify_mode => OpenSSL::SSL::VERIFY_NONE) do |ftp|
    ...
  files = ftp.list(file_path)
  STDOUT.write files
end

Я получаю следующую ошибку во время выполнения при запуске выше:

  bunches of traceback lines
  <path_to_gems>/double-bag-ftps-0.1.4/lib/double_bag_ftps.rb:160:in `initialize': wrong argument type nil (expected OpenSSL/SSL/CTX) (TypeError)

Я не могу вывести что-либо из сервера с Ruby итрадиционный камень net / ftp (различные ошибки, связанные с проблемами TLS / SSL). DoubleBagFTPS , кажется, самый многообещающий драгоценный камень, но я все еще получаю ошибку.Возможно, я неправильно вызываю функцию open.Единственный nil является четвертым параметром, но он четко прописан в примере DooubleBagFTPS.

Может кто-нибудь помочь?

Обновление

Perпредложение, вот мой новый код

 class MyFTP < Net::FTP
   FTP_PORT = 990

   def connect(host, port = FTP_PORT)
     synchronize do
       @host = host
       @bare_sock = open_socket(host, port)
       begin
         ssl_sock = start_tls_session(Socket.tcp(host, port))
         @sock = BufferedSSLSocket.new(ssl_sock, read_timeout: @read_timeout)
         voidresp
         if @private_data_connection
           voidcmd("PBSZ 0")
           voidcmd("PROT P")
         end
       rescue OpenSSL::SSL::SSLError, Net::OpenTimeout
         @sock.close
         raise
      end
    end
   end
 end

   def ftp_options
     {
       username: 'user',
       password: 'password',
       ssl: true,
       passive: true
     }
   end


MyFTP.open(ftp_host, ftp_options) do |ftp|
  ftp.login
  files = ftp.chdir(file_path)
  files = ftp.list
  STDOUT.write files
end

Я все еще получаю сообщение об ошибке следующим образом:

 ---stack-trace---
 <path_to_gem>/ruby/2.5.0/net/protocol.rb:52:in `connect': SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: unknown protocol (OpenSSL::SSL::SSLError)

1 Ответ

0 голосов
/ 24 декабря 2018

Итак, я установил работу с обычным старым Net :: FTP следующим образом:

 def ftp_options
   {
      username: '<username>',
      password: '<password>',
      ssl: {
        verify_mode: OpenSSL::SSL::VERIFY_NONE
      }
    }
 end

 Net::FTP.open(ftp_host, ftp_options) do |ftp|
   ftp.login(ftp_options[:username], ftp_options[:password])
   files = ftp.list
   STDOUT.write files
   puts "\n"
 end

Единственное, чего я не понимаю, это то, почему я вынужден передать имя пользователя и пароль в ftp.метод входа в систему, поскольку он уже определен в ftp_options, который был передан в Net :: FTP.open ().Насколько я могу судить, все настроено правильно в ftp_options.Для конкретного сервера, к которому я подключаюсь, требуется TLS / SSL, и это работает, поэтому выбирается переменная параметра ... почему бы не пользователь / пароль?

В любом случае, дело закрыто для меня внаименее.Я могу подтвердить, что обычный Net :: FTP, кажется, работает по крайней мере с одним из этих не-vanilla FTP-серверов, требующих TLS и неявного SSL.

...