Ruby Sinatra 在没有 PEM 和 OpenSSL::SSL::VERIFY_NONE 的情况下创建 post 请求

Ruby Sinatra create post request without PEM and OpenSSL::SSL::VERIFY_NONE

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

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 证书的情况下创建发送 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

SSL/HTTPS 请求 PEM 证书

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 和 OpenSSL::SSL::VERIFY_NONE 的情况下创建 POST 方法?

这个问题有点误导,不过我尽力弄明白了。这是我的建议:

是否要连接到只能通过 https 访问的服务并且不关心证书是否有效?

那么在初始化Net::HTTP客户端的时候就可以使用:verify_mode => OpenSSL::SSL::VERIFY_NONE了。 您将拥有某种传输安全性,但您无法确定与您通话的服务器就是您认为的那台服务器。你很脆弱。

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

那么你应该使用 http://... 端点。

您想连接到服务并且关心传输安全吗?

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