2012-03-20 44 views
5

Nhà cung cấp tôi lấy tệp từ đang thay đổi từ FTP sang FTP qua SSL.Kết nối với máy chủ không được bảo mật qua FTP qua TLS/SSL

Tôi cố gắng để cập nhật mã của tôi từ net/ftp để net/ftptls

Người dẫn chương trình mới tôi cần phải kết nối với không được xác nhận và kịch bản của tôi báo cáo lại lỗi này.

hostname đã không phù hợp với các chứng chỉ máy chủ

Nhà cung cấp sẽ không sửa lỗi này.

Nhìn vào /usr/lib/ruby/1.8/net/ftptls.rb Tôi nghĩ sẽ không quá khó khăn để vá lỗi FTPTLS để bỏ qua máy chủ không đáng tin cậy.

Tôi đã thử thay đổi verify_mode thành OpenSSL::SSL::VERIFY_NONE và nhận xét ra dòng post_connection_check`.

không hoạt động.

Bất kỳ suy nghĩ nào về cách thực hiện việc này?

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 

Trả lời

2

Đây có thể là câu trả lời chậm nhất trên thế giới, nhưng tôi đã xem xét câu hỏi của bạn và nó đã giúp tôi tự khắc phục, vì vậy tôi muốn đăng cho hậu thế.

Bạn đã rất thân thiết, bạn chỉ cần nhận xét ra #post_connection_check.

Những gì tôi đã làm, chứ không phải là bắt chước bản thân ruby, đã mang một bản sao này vào/lib của dự án của tôi.

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 

Tôi cũng làm sạch thông số đi qua một chút. Bạn sẽ sử dụng này như sau:

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

Tôi biết điều này có lẽ là quá muộn cho Poul nhưng tôi thấy các double-bag-ftps gem là đủ và dễ sử dụng khi tôi đã phải làm một cái gì đó tương tự.

Các vấn đề liên quan