gpt4 book ai didi

ruby SSL 代理(MITM)

转载 作者:太空宇宙 更新时间:2023-11-03 14:13:03 25 4
gpt4 key购买 nike

我想代理 SSL 数据,在本例中为 HTTPS。

这是我的代码:

begin
server = TCPServer.open(on_demand_port)
rescue Exception => e
sleep 5
retry
end
sslContext = OpenSSL::SSL::SSLContext.new
sslContext.verify_mode = OpenSSL::SSL::VERIFY_NONE
begin
sslContext.cert = OpenSSL::X509::Certificate.new(File.open("#{Dir.pwd}/Cert/cert.pem"))
sslContext.key = OpenSSL::PKey::RSA.new(File.open("#{Dir.pwd}/Cert/key.pem"), "1234")

rescue Exception => e
sleep 5
retry
end
begin
sslServer = OpenSSL::SSL::SSLServer.new(server, sslContext)
rescue Exception => e
sleep 5
retry
end

while true

begin
threads << Thread.new(sslServer.accept) do |client| # Putting new connections into the thread pool
tcp_proxy(client, db_name, db_user, db_password, remote_host, remote_port, patterns)
end
rescue Exception => e
end



threads = threads.select { |t| t.alive? ? true : (t.join; false) }
while threads.size >= on_demand_max_threads
sleep 1
threads = threads.select { |t| t.alive? ? true : (t.join; false) }
end
end

这是“tcp_proxy”,它是实际的 SSL 代理

begin
begin
ssl_context = OpenSSL::SSL::SSLContext.new
ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
cert_store = OpenSSL::X509::Store.new
cert_store.set_default_paths
ssl_context.cert_store = cert_store
tcp_socket = TCPSocket.new(remote_host, remote_port)
server_socket = OpenSSL::SSL::SSLSocket.new tcp_socket, ssl_context
server_socket.sync_close = true
server_socket.connect
rescue Exception => e
client.close
end
while true
# Wait for data to be available on either socket.
(ready_sockets, dummy, dummy) = IO.select([client, server_socket])
begin
ready_sockets.each do |socket|
data = socket.readpartial(4096)
if socket == client
# Read from client, write to server.
server_socket.write data
server_socket.flush
else
# Read from server, write to client.
client.write data
client.flush
end
end
rescue Exception => e
end
end
rescue StandardError => e
end
begin
client.close
server_socket.close
rescue Exception => e
end

现在,这在普通的 TCP 和 HTTP 中运行良好,但是,当我在升级套接字时在 SSL\HTTPS 中使用它时,它开始变得非常非常慢,有时甚至会超时。

知道为什么吗?

最佳答案

您必须小心读取和选择,因为读取是在 SSL 级别完成的,而选择是在 TCP 级别完成的。

SSL 将数据放入帧中,每个帧最多包含 16384 字节。它需要先从底层 TCP 套接字读取完整的帧,然后 SSL 套接字上的读取才能从帧中返回任何数据。这意味着如果您有一个具有 4097 字节有效负载的帧,则需要先从 TCP 套接字读取完整帧,然后才能从 SSL 套接字读取任何内容。如果您随后仅从 SSL 套接字读取 4096 个字节,它将返回前 4096 个字节并将其余(1 个字节)留在 SSL 缓冲区中。如果您随后在 TCP 级别使用 select 检查新数据,它可能会阻塞,因为在 TCP 级别没有未读数据,即使 SSL 缓冲区中仍有单个字节。

有两种方法可以解决这个问题:

  • 检查 pending 是否 SSL 缓冲区中仍有数据。如果有,请阅读它们而不是进行选择。
  • 或者尝试每次读取至少 16384 字节,这是 SSL 帧的最大大小。我不确定 ruby​​ 中的实现,但在 Perl 中,此读取将仅调用底层 SSL_read 并且这仅从单个帧读取数据。因此,读取大小为 16384 字节时,不会有待处理的数据,您可以像现在一样调用 select。

关于 ruby SSL 代理(MITM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26467867/

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