3

对于一个项目,我需要通过 Socks5 代理进行 HTTPS 调用,以便我可以访问客户的远程 API。我使用的原始代码是这样的:

url = "/proxyValidate?service=#{migration_station_verification_url}&ticket=#{service_ticket}"

if Rails.env == 'development'
  uri = URI.parse(soe_cas_url + url)
  Net::HTTP.SOCKSProxy('127.0.0.1', 1080).start(uri.host, uri.port) do |http|
    res = http.get(uri.path)
    doc = Nokogiri::XML(res)
    doc.remove_namespaces!
    doc.xpath('//sessionId').first.content
  end
else
  http = Net::HTTP.new(soe_cas_url)
  http.use_ssl = true
  req = Net::HTTP::Get.new(url)
  res = http.request(req)
  doc = Nokogiri::XML(res)
  doc.remove_namespaces!
  doc.xpath('//sessionId').first.content
end

目标是仅在开发环境中使用代理。当我使用代理拨打电话时,我收到错误消息:

错误的状态行:“<!DOCTYPE

谷歌搜索这表明我需要将use_ssl标志设置为 true,这在开发周期之外工作。使用 socksify 时没有这样的机制。如果我在 do 块内调用它,我会收到会话已启动的错误。在块外调用它会返回一个异常,即不存在这样的函数。

谁能告诉我如何通过 socksify 代理运行 SSL/HTTPS?

编辑:

我目前正在使用纯套接字来获得我想要的东西,使用以下代码:

  socket = Socket::TCPSocket.open('127.0.0.1', 1080)

  ssl_context = OpenSSL::SSL::SSLContext.new
  ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
  ssl_context.ca_file = File.join(Rails.root, 'ssl', 'cacert.pem')

  ssl_socket = OpenSSL::SSL::SSLSocket.new(socket, ssl_context)
  ssl_socket.sync_close = true
  ssl_socket.connect

  request = "GET #{url} HTTP/1.1\r\nAccept: */*\r\nHost: #{soe_cas_url}"
  ssl_socket.puts(request)
  ssl_socket.puts("")

  response = ""
  while (line = ssl_socket.gets)
    response << line
  end

然而,这在ssl_socket.connect失败并出现以下错误:

ssl_connect 系统调用返回=5 errno=0 状态=sslv2/v3 读取服务器你好 a

我试过使用自签名证书,没有证书等,但似乎没有任何效果。我知道端点依赖于 staging environmnet 上的自签名证书。

4

0 回答 0