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
!
如果您收到证书验证错误,请确保您的系统上安装了正确的证书颁发机构。
我尝试使用 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
!
如果您收到证书验证错误,请确保您的系统上安装了正确的证书颁发机构。