gpt4 book ai didi

ruby - 通过基于 TLS/SSL 的 FTP 连接到未经认证的主机

转载 作者:数据小太阳 更新时间:2023-10-29 07:17:10 25 4
gpt4 key购买 nike

我获取文件的供应商正在从 FTP 更改为 FTP over SSL。

我正在尝试将我的代码从 net/ftp 更新到 net/ftptls

我需要连接的新主机未经认证,我的脚本报告了这个错误。

hostname was not match with the server certificate

供应商不会解决这个问题。

查看 /usr/lib/ruby/1.8/net/ftptls.rb 我认为猴子修补 FTPTLS 以忽略不受信任的主机不会太难。

我尝试将 verify_mode 更改为 OpenSSL::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

最佳答案

这可能是世界上最慢的答案,但我遇到了你的问题,它帮助我自己解决了这个问题,所以我想为后代发帖。

你非常接近,你只需要注释掉#post_connection_check。

我所做的不是对 ruby​​ 本身进行 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

我还稍微清理了传递的参数。你会像这样使用它:

  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

关于ruby - 通过基于 TLS/SSL 的 FTP 连接到未经认证的主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9794504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com