在localhost上执行HTTPS请求的麻烦

时间:2011-02-18 21:50:11

标签: ruby-on-rails ruby ruby-on-rails-3 https request

我正在使用Ruby on Rails 3,我正在尝试在 localhost 上使用HTTPS来实现API。我所做的是受到Paul Dix's code的启发。

经过很多麻烦之后,我能够生成证书,设置Apache并编写一些代码。好像我接近一个解决方案。这就是我到目前为止所做的:

require 'uri'
require 'net/https'

...

    host = "https://<my_site_name>.com"
    path = "/users/1.json"

    uri = URI.parse("#{host}#{path}")

    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    http.ca_file = File.join(File.dirname("/private/etc/apache2/ssl/wildcard.certificate/ca.db.certs/"), "01.pem")
    http.start do
      puts http.get("#{host}#{path}")
    end

    @test_response = http

@test_response解析为:

<Net::HTTP <my_site_name>.com:443 open=false>

这是我第一次做这种事情,而且我不是专家为它实现代码,所以我有一些问题:

(1)uri = URI.parse("#{host}#{path}")是什么意思?什么是uri范围?

(2)为什么Paul Dix使用:

http.start do
  puts http.get("#{host}#{path}")
end

而不是

@test_response = http.get("#{host}#{path}")

(3)使用Paul Dix的版本,我如何阅读@test_response值?做@test_response = http是对的吗?

(4)为什么当我使用http.verify_mode = OpenSSL::SSL::VERIFY_PEER代替http.verify_mode = OpenSSL::SSL::VERIFY_NONE时,我收到此错误:

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

(5)我应该在我的Ruby on Rails应用程序中将.pem证书放在哪里?

(6)以上代码是否正确且可取?如果没有,我可以改进什么?


我发现的另一件事是我使用

http.start do
  @test_response = http.get("#{host}#{path}")
end

@test_response返回

--- !ruby/object:Net::HTTPOK 
body: ...
body_exist: true
code: "200"
header: 
  ...
  status: 
  - "200"
  transfer-encoding: 
  - chunked
  content-type: 
  - application/json; charset=utf-8
http_version: "1.1"
message: OK
read: true

如果我只使用

@internal_test2 = http.get("#{host}#{path}")

@test_response返回

--- !ruby/object:Net::HTTPOK 
body: ...
body_exist: true
code: "200"
header: 
  ...
  status: 
  - "200"
  connection:    # This is the differce from the previous result
  - close
  transfer-encoding: 
  - chunked
  content-type: 
  - application/json; charset=utf-8
http_version: "1.1"
message: OK
read: true

(7)这是什么意思?

1 个答案:

答案 0 :(得分:2)

我不确定你在这里想要完成什么(看起来你正试图连接并阅读HTTPS请求),但我会尽力回答你的问题。

(1)uri = URI.parse("#{host}#{path}")是什么意思?什么是uri范围?

根据它的API documentationURI.parse接受一个字符串(在本例中为"#{host}#{path}"并从中返回一个URI的子类。重点是获取一个URI对象而不是一个string。(URI是一个Ruby模块。)

(2)为什么Paul Dix使用:

http.start do
  puts http.get("#{host}#{path}")
end

再次,请参阅documentation for Net::HTTP#start。通过使用一个块,他打开了TCP连接和HTTP会话,这两个都在块执行完毕后自动关闭。

(3)使用Paul Dix的版本,我如何阅读@test_response值?做@test_response = http是对的吗?

我不确定你的意思。如果您执行@test_response = http,则@test_response的值与http的值相同。您可以从中读取响应正文等。

(4)为什么当我使用http.verify_mode = OpenSSL::SSL::VERIFY_PEER代替http.verify_mode = OpenSSL::SSL::VERIFY_NONE时,我收到此错误:

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

这是因为Ruby无法找到证书颁发机构证书。有关可能修复此问题的详细信息,请参阅http://martinottenwaelter.fr/2010/12/ruby19-and-the-ssl-error/

(5)我应该在我的Ruby on Rails应用程序中将.pem证书放在哪里?

我认为这是特定于您用于提供 Rails应用程序的服务器,而不是Rails应用程序本身。

(6)这是什么意思?

我认为这只是表明HTTP会话已经关闭。见#2。