2012-03-20 17 views
5

Un proveedor del que tomo un archivo está cambiando de FTP a FTP a través de SSL.Conectarse a un host no certificado a través de FTP a través de TLS/SSL

que estoy tratando de actualizar mi código de net/ftp a net/ftptls

El nuevo huésped que necesito para conectarse no está certificado y mi script informa de vuelta este error.

nombre de host no se corresponde con el certificado de servidor

El vendedor no solucionará el problema.

En cuanto a /usr/lib/ruby/1.8/net/ftptls.rb pensé que no sería demasiado difícil monetizar patch FTPTLS para ignorar el host no confiable.

Intenté cambiar verify_mode por OpenSSL::SSL::VERIFY_NONE y comenté la línea post_connection_check`.

ninguno funcionó.

¿Alguna idea sobre cómo hacer esto?

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 

Respuesta

2

Esta puede ser la respuesta lento del mundo, pero me encontré con su pregunta y que ayudó a mi solucionar yo mismo, así que quería escribir para la posteridad.

Estuviste muy cerca, solo tienes que comentar #post_connection_check.

Lo que hice, en lugar de monkeypatching ruby ​​en sí, fue traer una copia de esto a/lib de mi proyecto.

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 

También limpié el param pasando un poco. Se podría utilizar este 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

Sé que esto es probablemente demasiado tarde para Poul pero encontré la double-bag-ftps gem a ser suficiente y fácil de usar cuando tenía que hacer algo similar.

Cuestiones relacionadas