我正在尝试将本机FTP连接工作连接到ruby中的奇数FTP服务器。它需要TLS和隐式SSL。我已经配置了FileZilla客户端并且可以正常工作。这是我的代码:
require 'double_bag_ftps'
DoubleBagFTPS.open(ftp_host, ftp_user, passwd, nil, DoubleBagFTPS::IMPLICIT, :verify_mode => OpenSSL::SSL::VERIFY_NONE) do |ftp|
...
files = ftp.list(file_path)
STDOUT.write files
end
运行以上命令时,出现以下运行时错误:
bunches of traceback lines
<path_to_gems>/double-bag-ftps-0.1.4/lib/double_bag_ftps.rb:160:in `initialize': wrong argument type nil (expected OpenSSL/SSL/CTX) (TypeError)
我似乎无法使用Ruby和传统的net / ftp gem从服务器中获得任何东西(与TLS / SSL问题有关的各种错误)。 DoubleBagFTPS似乎是最有前途的宝石,但我仍然遇到错误。可能是因为我没有正确调用open函数。唯一的nil
是第四个参数,但是在DooubleBagFTPS示例中清楚地阐明了这一点。
有人可以帮忙吗?
更新
根据建议,这是我的新代码
class MyFTP < Net::FTP
FTP_PORT = 990
def connect(host, port = FTP_PORT)
synchronize do
@host = host
@bare_sock = open_socket(host, port)
begin
ssl_sock = start_tls_session(Socket.tcp(host, port))
@sock = BufferedSSLSocket.new(ssl_sock, read_timeout: @read_timeout)
voidresp
if @private_data_connection
voidcmd("PBSZ 0")
voidcmd("PROT P")
end
rescue OpenSSL::SSL::SSLError, Net::OpenTimeout
@sock.close
raise
end
end
end
end
def ftp_options
{
username: 'user',
password: 'password',
ssl: true,
passive: true
}
end
MyFTP.open(ftp_host, ftp_options) do |ftp|
ftp.login
files = ftp.chdir(file_path)
files = ftp.list
STDOUT.write files
end
我仍然收到如下错误:
---stack-trace---
<path_to_gem>/ruby/2.5.0/net/protocol.rb:52:in `connect': SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: unknown protocol (OpenSSL::SSL::SSLError)
答案 0 :(得分:1)
因此我将其与常规的旧Net :: FTP一起使用,如下所示:
def ftp_options
{
username: '<username>',
password: '<password>',
ssl: {
verify_mode: OpenSSL::SSL::VERIFY_NONE
}
}
end
Net::FTP.open(ftp_host, ftp_options) do |ftp|
ftp.login(ftp_options[:username], ftp_options[:password])
files = ftp.list
STDOUT.write files
puts "\n"
end
我不明白的一件事是为什么我被迫将用户名和密码传递给ftp.login方法,因为它已经在ftp_options中定义,并已传递给Net :: FTP.open()。据我所知,一切都在ftp_options中正确设置。对于我要连接的特定服务器,TLS / SSL是必需的,并且可以正常工作,因此正在提取参数变量...为什么不使用用户名/密码?
无论如何,案件至少对我来说还是结案了。我可以确认常规Net :: FTP似乎可以与这些至少需要TLS和隐式SSL的非香草FTP服务器一起使用。