2013-05-08 47 views
3

我想从使用FTPS的服务器获取文件。我可以进行身份​​验证,但是当我尝试列出/获取这些文件时,我得到一个“521数据连接必须加密”。 Net :: FTP模块能够做到这一点,我将如何实现它?使用红宝石加密传输FTPS

我修改了Net :: FTPTLS到我自己的类中,因为我需要存储一个自签名证书。

require 'socket' 
require 'openssl' 
require 'net/ftp' 

module MP 
    class FTPS < Net::FTP 
    def connect(host, port=FTP_PORT) 
     @hostname = host 
     super 
    end 

    def login(user = "anonymous", passwd = nil, cert_file = nil, acct = nil) 
     store = OpenSSL::X509::Store.new 
     if cert_file == nil 
     store.set_default_paths 
     else 
     certraw = File.read(cert_file) 
     cert = OpenSSL::X509::Certificate.new(certraw) 
     store.add_cert(cert) 
     end 
     ctx = OpenSSL::SSL::SSLContext.new('SSLv23') 
     ctx.cert_store = store 
     ctx.verify_mode = OpenSSL::SSL::VERIFY_PEER 
     ctx.key = nil 
     ctx.cert = cert 
     voidcmd("AUTH TLS") 
     @sock = OpenSSL::SSL::SSLSocket.new(@sock, ctx) 
     @sock.connect 
     #@sock.post_connection_check(@hostname) 
     super(user, passwd, acct) 
     voidcmd("PBSZ 0") 
    end 
    end 
end 

而这里的片断为试图获取文件:

def get_ftpclient(host) 
    FTPS::new(host) 
end 

def check_for_files 
    @ftp = get_ftpclient(@host) 
    @ftp.passive = true 
    @ftp.login(@user_name, @password, @cert_file) 
    @ftp.chdir(@remote_dir) 
    files = @ftp.nlst 
    files 
end 

它未能在NLST。

编辑:我尝试添加voidcmd(“PROT P”)的登录功能的结束,但它只是挂起了一会儿,然后我最终得到:

IOError: Unsupported record version Unknown-48.48 
___BEGIN BACKTRACE___ 
org/jruby/ext/openssl/SSLSocket.java:564:in `sysread' 
/opt/jruby/lib/ruby/gems/1.8/gems/jruby-openssl-0.7.6.1/lib/1.8/openssl/buffering.rb:36:in `fill_rbuff' 
/opt/jruby/lib/ruby/gems/1.8/gems/jruby-openssl-0.7.6.1/lib/1.8/openssl/buffering.rb:159:in `eof?' 
/opt/jruby/lib/ruby/gems/1.8/gems/jruby-openssl-0.7.6.1/lib/1.8/openssl/buffering.rb:134:in `readline' 
/opt/jruby/lib/ruby/1.8/net/ftp.rb:211:in `getline' 
    /opt/jruby/lib/ruby/1.8/net/ftp.rb:221:in `getmultiline' 
/opt/jruby/lib/ruby/1.8/net/ftp.rb:235:in `getresp' 
/opt/jruby/lib/ruby/1.8/net/ftp.rb:251:in `voidresp' 
/opt/jruby/lib/ruby/1.8/net/ftp.rb:436:in `retrlines' 
/opt/jruby/lib/ruby/1.8/monitor.rb:191:in `mon_synchronize' 
/opt/jruby/lib/ruby/1.8/net/ftp.rb:422:in `retrlines' 
/opt/jruby/lib/ruby/1.8/net/ftp.rb:612:in `nlst' 
... etc 

回答

1

我意识到这是一个老问题,但我在研究FTPS红宝石宝石时偶然发现了它。

号net :: FTP本身不支持FTPS。

我强烈推荐double-bag-ftps

提供一个Net :: FTP子类来支持隐式和显式的FTPS。

版本0.1.1一直在为我过去一年每天运行的精美工作。