2012-03-20 32 views
5

ベンダーベンダーからのファイルをFTP経由でFTP経由でFTPに変更しています。TLS/SSL経由でFTP経由で未認証のホストに接続

私はnet/ftpからnet/ftptls

私は接続する必要が新しいホストが保証されていませんし、私のスクリプトが戻ってこのエラーを報告し、私のコードを更新しようとしています。

ホスト名は、ベンダーはこの問題を解決しませんサーバー証明書

と一致していませんでした。

投稿者/usr/lib/ruby/1.8/net/ftptls.rb私は、monkey-patch FTPTLSが信頼できないホストを無視するのは難しくないと思った。

verify_modeOpenSSL::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もコメントアウトするだけで済みます。

ルビー自身をmonkeypatchingするのではなく、これを私のプロジェクトの/ libに持ってきました。

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 

また、私は少しを渡すのparamをクリーンアップ。あなたはそのようにこれを使用します。

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

私はこれが遅すぎるPOULため、おそらく知っているが、私は十分なと私は似た何かをしなければならなかったときに使用しやすいようにdouble-bag-ftps gemを発見しました。