2012-03-20 20 views
5

Un fornitore da cui il file viene trasferito passa da FTP a FTP su SSL.Connessione a host non certificato tramite FTP su TLS/SSL

Sto cercando di aggiornare il mio codice net/ftp a net/ftptls

Il nuovo ospite che ho bisogno di connettersi non è certificato e il mio script riporta indietro questo errore.

nome host non è stato corrisponde con il certificato del server

Il venditore non risolverà questo.

Guardando a /usr/lib/ruby/1.8/net/ftptls.rb Ho pensato che non sarebbe stato troppo difficile eseguire il patch FTPTLS per ignorare l'host non affidabile.

Ho provato a cambiare verify_mode a OpenSSL::SSL::VERIFY_NONE ea commentare la riga post_connection_check`.

non ha funzionato.

Qualche idea su come fare questo?

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 

risposta

2

Questa può essere la risposta più lento del mondo, ma mi sono imbattuto in tua domanda ed aiutato la mia correzione manuale, così ho voluto pubblicare per i posteri.

Eri molto vicino, devi solo commentare #post_connection_check.

Quello che ho fatto, piuttosto che il rubino monkeypatching stesso, è stato portare una copia di questo in/lib del mio progetto.

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 

Ho anche ripulito il param passando un po '. Si potrebbe utilizzare questo modo:

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

So che questo è probabilmente troppo tardi per Poul ma ho trovato il double-bag-ftps gem essere sufficiente e facile da usare quando ho dovuto fare qualcosa di simile.