2012-03-20 12 views
5

Dostawca, z którego pobieram plik, zmienia się z FTP na FTP przez SSL.Nawiązywanie połączenia z niecertyfikowanym hostem za pośrednictwem FTP przez TLS/SSL

Próbuję zaktualizować kod z net/ftp do net/ftptls

Nowy gospodarz muszę się połączyć nie jest certyfikowany i mój skrypt informuje powrotem ten błąd.

hosta nie pasuje do certyfikatu serwera

Sprzedawca nie będzie to naprawić.

Patrząc na /usr/lib/ruby/1.8/net/ftptls.rb Pomyślałem, że nie będzie zbyt trudno patchować FTPTLS, aby zignorować niezaufanego hosta.

Próbowałem zmienić verify_mode na OpenSSL::SSL::VERIFY_NONE i komentując linię post_connection_check.

żaden nie zadziałał.

Wszelkie myśli o tym, jak to zrobić?

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 

Odpowiedz

2

Ta odpowiedź może być najwolniejszy na świecie, ale natknąłem się na swoje pytanie i to pomogło moje rozwiązać samodzielnie, więc chciałem pisać dla potomności.

Byliście bardzo blisko, wystarczy również wykomentuj #post_connection_check.

Co zrobiłem, zamiast monkeypatching sam rubin, było przynieść kopię tego w/lib mojego projektu.

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 

Również wyczyściłem param przechodząc nieco. Można by to wykorzystać tak:

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

wiem, to chyba za późno Poul ale znalazłem double-bag-ftps gem być wystarczające i łatwy w użyciu, gdy musiałem zrobić coś podobnego.

Powiązane problemy