2

我在我们的 Ruby 1.8.7 项目中有以下方法:

def self.ping_server
  request_data = get_request_data

  uri = 'another_server.our_company.com'
  https = Net::HTTP.new(uri)
  https.use_ssl = true
  path = "/our_service"
  data = request_data.to_json
  response = https.post(path, data, {'Content-Type' => 'application/json'})

  return response
end

每当我运行此方法时,都会出现以下超时错误:

在 128936 毫秒内完成 500 内部服务器错误

Errno::ETIMEDOUT (Connection timed out - connect(2)):
  lib/my_class.rb:51:in `ping_our_server'

我与一位有权访问another_server.our_company.com. 我的请求没有到达另一台服务器。

我应该怎么做才能让我的请求生效?


编辑:经过进一步检查,这就是我认为正在发生的事情(但我不完全确定):我们的其他服务器将只接受 HTTPS 请求,但看起来我的请求由于某种原因正在通过 HTTP 发送。我需要添加什么来确保我的请求是通过 HTTPS 发送的吗?

4

1 回答 1

3

根据这个网站,这是您发送 HTTPS 请求的方式:

require "net/https"
require "uri"

uri = URI.parse("https://secure.com/")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Get.new(uri.request_uri)

response = http.request(request)
response.body
response.status
response["header-here"] # All headers are lowercase

根据这个网站(链接自我的第一个链接),您还应该这样做以关闭net/https库中的漏洞:

要开始,您需要一个本地 CA 证书包,官方 curl 站点维护一个最新的cacert.pem / ca-bundle.crt文件,其中包含所有主要证书(如果您需要)。

接下来,在 gem install always_verify_ssl_certificates 之后,您可以启动并运行测试,如下所示:

require 'always_verify_ssl_certificates'
AlwaysVerifySSLCertificates.ca_file = "/path/path/path/cacert.pem"

http= Net::HTTP.new('https://some.ssl.site', 443)
http.use_ssl = true
req = Net::HTTP::Get.new('/')
response = http.request(req)

如果该站点的证书不正确,此时将引发错误。如果不是,则返回一个合法的 HTTP 响应对象。

于 2013-10-25T23:23:40.677 回答