2012-03-20 20 views
5

पर एफ़टीपी के माध्यम से अनिश्चित होस्ट से कनेक्ट करें एक विक्रेता जो मैं एक फाइल लेता हूं, से एसएसएल पर एफ़टीपी से एफ़टीपी में बदल रहा है।टीएलएस/एसएसएल

मैं net/ftp से net/ftptls

नया मेजबान मैं कनेक्ट करने की आवश्यकता करने के लिए प्रमाणित नहीं है और मेरी स्क्रिप्ट वापस इस त्रुटि की रिपोर्ट करने के लिए अपने कोड को अद्यतन करने की कोशिश कर रहा हूँ।

होस्ट नाम सर्वर प्रमाणपत्र

विक्रेता इस ठीक नहीं होगा के साथ मेल नहीं किया गया था।

/usr/lib/ruby/1.8/net/ftptls.rb पर देखकर मैंने सोचा कि अविश्वसनीय होस्ट को अनदेखा करने के लिए बंदर-पैच FTPTLS को बहुत मुश्किल नहीं होगा।

मैंने verify_mode को OpenSSL::SSL::VERIFY_NONE में बदलने और post_connection_check` पंक्ति को टिप्पणी करने का प्रयास किया।

न तो काम किया।

यह कैसे करें इस पर कोई विचार?

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

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

    def login(user = "anonymous", passwd = nil, acct = nil) 
     store = OpenSSL::X509::Store.new 
     store.set_default_paths 
     ctx = OpenSSL::SSL::SSLContext.new('SSLv23') 
     ctx.cert_store = store 
     ctx.verify_mode = OpenSSL::SSL::VERIFY_PEER 
     ctx.key = nil 
     ctx.cert = nil 
     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 

उत्तर

2

यह दुनिया की सबसे धीमी जवाब हो सकता है, लेकिन मैं अपने प्रश्न भर में भाग गया और यह मेरी यह ठीक अपने आप को मदद की, तो मैं भावी पीढ़ी के लिए पोस्ट करने के लिए करना चाहता था।

आप बहुत करीब थे, आपको बस #post_connection_check पर टिप्पणी करने की आवश्यकता है।

मैंने रूबी स्वयं बंदर की बजाय, मैंने अपनी परियोजना की इस प्रतिलिपि में इसकी एक प्रतिलिपि लाई थी।

module Net 

    class FTPTLS < FTP 
    def connect(host, port=FTP_PORT) 
     @hostname = host 
     super 
    end 

    def login(user = "anonymous", params = {:password => nil, :acct => nil, :ignore_cert => false}) 
     store = OpenSSL::X509::Store.new 
     store.set_default_paths 
     ctx = OpenSSL::SSL::SSLContext.new('SSLv23') 
     ctx.cert_store = store 
     ctx.verify_mode = params[:ignore_cert] ? OpenSSL::SSL::VERIFY_NONE : OpenSSL::SSL::VERIFY_PEER 
     ctx.key = nil 
     ctx.cert = nil 
     voidcmd("AUTH TLS") 
     @sock = OpenSSL::SSL::SSLSocket.new(@sock, ctx) 
     @sock.connect 
     @sock.post_connection_check(@hostname) unless params[:ignore_cert] 
     super(user, params[:password], params[:acct]) 
     voidcmd("PBSZ 0") 
    end 
    end 
end 

मैंने थोड़ी सी गुजरने वाले परम को भी साफ किया। तुम इतनी तरह इस का प्रयोग करेंगे:

require 'ftptls' # Use my local version, not net/ftptls 
    @ftp_connection = Net::FTPTLS.new() 
    @ftp_connection.passive = true 
    @ftp_connection.connect(host, 21) 
    @ftp_connection.login('user', :password => 'pass', :ignore_cert => true) 

HTH

2

मैं जानता हूँ कि यह शायद पॉल के लिए बहुत देर हो चुकी है, लेकिन मैं double-bag-ftps gem पाया पर्याप्त और जब मैं कुछ इसी तरह करना था का उपयोग करने के लिए आसान हो सकता है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^