Ruby Sinatra创建没有PEM和OpenSSL :: SSL :: VERIFY_NONE的发布请求

时间:2015-04-20 07:14:23

标签: ruby ssl sinatra

我尝试使用SSL创建POST请求但没有OpenSSL :: SSL :: VERIFY_NONE,因为它会打开安全攻击并且没有PEM证书。 但是我发现问题,我发送POST请求的ruby代码:

post '/test/test1' do
  cross_origin
  post_data = request.body.read
  res_Data = JSON.parse(post_data)
  userName = res_Data['username']

  @responseFromServer=''
  uri = URI('https://test.com/test1')
  Net::HTTP.start(uri.host, uri.port,
                  :use_ssl => uri.scheme == 'https',
                  :verify_mode => OpenSSL::SSL::VERIFY_NONE) do |http|
    request = Net::HTTP::Post.new uri.request_uri
    request.basic_auth 'aa', 'bb'
    request.body = {'username' =>userName}.to_json
    response = http.request request
    @responseFromServer = response.body.to_s
  end
  newJson = JSON.parse(@responseFromServer)

  status_msg = newJson['status']['status_msg']
  if (status_msg == "Success")
    return 'true'
  end
    return 'false'
end

这是方法工作,但他使用OpenSSL :: SSL :: VERIFY_NONE。如何在没有OpenSSL :: SSL :: VERIFY_NONE和PEM sertificate的情况下创建发送POST请求的方法?

修改 SSL / 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

带有PEM证书的SSL / HTTPS请求

require "net/https"
require "uri"

uri = URI.parse("https://secure.com/")
pem = File.read("/path/to/my.pem")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.cert = OpenSSL::X509::Certificate.new(pem)
http.key = OpenSSL::PKey::RSA.new(pem)
http.verify_mode = OpenSSL::SSL::VERIFY_PEER

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

我的问题:如何创建没有PEM的POST方法和 OpenSSL :: SSL :: VERIFY_NONE

1 个答案:

答案 0 :(得分:1)

这个问题很容易引起误解,但我会尽力解决这个问题。以下是我的建议:

您是否要连接到仅通过https提供的服务,而您不关心证书是否有效?

然后,您可以在初始化:verify_mode => OpenSSL::SSL::VERIFY_NONE客户端时使用Net::HTTP。 您将拥有某种传输安全性,但您无法确定您正在与之交谈的服务器是您认为的服务器。你很脆弱。

您是否要通过https和http连接到可用的服务,而您不关心传输安全性?

然后你应该使用http://...端点。

您是否想要连接到服务并关注传输安全性?

然后你绝对应该使用https://...端点。 不要覆盖:verify_mode! 如果您收到证书验证错误,请确保在系统上安装了正确的证书颁发机构。