Я использую Ruby on Rails 3 и пытаюсь использовать HTTPS на localhost для реализации API. То, что я сделал, вдохновлено кодом Пола Дикса .
После многих головных болей мне удалось сгенерировать сертификат, настроить 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) Почему Пол Дикс использует:
http.start do
puts http.get("#{host}#{path}")
end
а не
@test_response = http.get("#{host}#{path}")
(3) Как использовать версию Пола Дикса, как я могу прочитать значения @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) Где я должен поставить свой сертификат .pem
в моем приложении Ruby on Rails?
(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) Что это значит?