我正在使用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)这是什么意思?
答案 0 :(得分:2)
我不确定你在这里想要完成什么(看起来你正试图连接并阅读HTTPS请求),但我会尽力回答你的问题。
(1)uri = URI.parse("#{host}#{path}")
是什么意思?什么是uri
范围?
根据它的API documentation,URI.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。