当前位置: 首页 > 知识库问答 >
问题:

使用Ruby和双袋FTPS gem实现FTPS连接

孔安阳
2023-03-14

我试图得到一个本机FTP连接工作到一个奇怪的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)

共有1个答案

欧金鹏
2023-03-14

所以我得到了它与正常的旧::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方法,因为它已经在ftp_options中定义,并传递给Net::FTP. open()。据我所知,ftp_options一切都设置正确。对于我连接到的特定服务器,需要TLS/SSL,这是工作的,所以参数变量被拾取...为什么不是用户/密码?

不管怎样,至少对我来说案子结了。我可以确认,常规::FTP似乎至少可以与其中一个需要TLS和隐式SSL的非普通FTP服务器一起工作。

 类似资料:
  • 本文向大家介绍Ruby中使用连续体Continuation实现生成器,包括了Ruby中使用连续体Continuation实现生成器的使用技巧和注意事项,需要的朋友参考一下 ruby中有很多经典的驱动器结构,比如枚举器和生成器等.这次简单介绍下生成器的概念.生成器是按照功能要求,一次产生一个对象,或称之为生成一个对象的方法.ruby中的连续体正好可以用来完成生成器的功能.连续体说起来晦涩,其实还是很

  • 我正在我的android应用程序中使用Apache Commons FTP库。 我正在使用带有JDK1.8的Android studio。 我很感激任何帮助,谢谢。

  • 本文向大家介绍Ruby实现的矩阵连乘算法,包括了Ruby实现的矩阵连乘算法的使用技巧和注意事项,需要的朋友参考一下 动态规划解决矩阵连乘问题,随机产生矩阵序列,输出形如((A1(A2A3))(A4A5))的结果。 代码:

  • 我正在创建一些restful Web服务,并使用Spring-Boot创建一个嵌入式tomcat容器。 其中一个要求是实现双向SSL。我一直在研究HttpSecurity对象,可以使用以下方法使其仅在SSL通道上运行webservices:- 我似乎找不到一种方法来使Web服务仅可供提供有效客户端证书的应用程序访问。 我只有SSL的基本知识,所以即使是正确方向的一般指针也将不胜感激。 正在部署的服

  • 本文向大家介绍Ruby中使用Block、Proc、lambda实现闭包,包括了Ruby中使用Block、Proc、lambda实现闭包的使用技巧和注意事项,需要的朋友参考一下 闭包(Closure),是指未绑定到任何对象的自由代码,闭包中的代码与任何对象和全局变量无关,只与执行此段代码的上下文相关。 今天我们简要的看一下ruby中的闭包实现。 Ruby中的闭包实现有:Block,Proc,Lamb

  • FTPS (also known as FTP Secure and FTP-SSL) is an extension to the commonly used File Transfer Protocol (FTP) that adds support for the Transport Layer Security (TLS) and the Secure Sockets Layer (SSL