我在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
每当我运行此方法时,我都会收到以下超时错误:
在128936ms完成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发送的吗?
答案 0 :(得分:2)
根据this website,这是您发送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
根据this website(从我的第一个链接链接),您还应该这样做以关闭net/https
库中的漏洞:
要开始,您需要一个本地CA证书包,官方 curl站点维护最新的cacert.pem / ca-bundle.crt文件 如果您需要,可以包含所有主要证书。
接下来,在gem安装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)
如果网站 证书不正确,此时会出现错误。如果没有,a 将返回合法的HTTP响应对象。