【问题标题】:Make FTPS connection in Ruby with double-bag-ftps gem使用 double-bag-ftps gem 在 Ruby 中建立 FTPS 连接
【发布时间】:2018-12-20 05:23:47
【问题描述】:

我正在尝试让本地 FTP 连接工作到 ruby​​ 中的一个奇怪的 FTP 服务器。它需要 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 gem 从服务器中获取任何信息(与 TLS/SSL 问题相关的各种错误)。 DoubleBagFTPS 似乎是最有前途的宝石,但我仍然收到错误消息。可能是我没有正确调用 open 函数。唯一的 nil 是第四个参数,但在 DooubleBagFTPS 示例中已明确说明。

有人可以帮忙吗?

更新

根据建议,这是我的新代码

 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)

【问题讨论】:

  • 根据 doublebags github 页面中的一个问题,有人提到从 Ruby 2.4.0 开始不需要 doublebag github.com/bnix/double-bag-ftps/issues/… - 下面还有另一条评论以及完整的代码示例 github.com/bnix/double-bag-ftps/issues/…跨度>
  • 我已经尝试了建议的代码。请参阅上面的更新。关于下一步尝试什么的任何想法?似乎我可能会错过一些完全愚蠢的东西。如果是这样,我很抱歉,因为我完全不熟悉通过 ruby​​ 与 ftp 交互。

标签: ruby ftp ftps


【解决方案1】:

所以我让它与常规的旧 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.login 方法,因为它已经在传递给 Net::FTP.open() 的 ftp_options 中定义。据我所知,ftp_options 中的所有内容都已正确设置。对于我要连接的特定服务器,TLS/SSL 是必需的,并且可以正常工作,因此正在获取参数变量...为什么不使用用户/密码?

不管怎样,至少我的案子已经结案了。我可以确认常规的 Net::FTP 似乎至少可以与这些需要 TLS 和隐式 SSL 的非普通 FTP 服务器之一一起使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    相关资源
    最近更新 更多