Проблемы с выполнением HTTPS-запросов на локальном хосте - PullRequest
0 голосов
/ 19 февраля 2011

Я использую 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) Что это значит?

1 Ответ

2 голосов
/ 20 февраля 2011

Я не совсем уверен, чего именно вы пытаетесь достичь здесь (похоже, вы пытаетесь подключиться и прочитать HTTPS-запрос), но я постараюсь ответить на ваши вопросы как можно лучше.

(1) Что означает uri = URI.parse("#{host}#{path}")? Что такое область действия uri?

Согласно документации API , URI.parse принимает строку (в данном случае "#{host}#{path}" и возвращает из нее один из подклассов URI. Суть в том, чтобы получить объект URI вместо строки . (URI - это модуль Ruby.)

(2) Почему Пол Дикс использует:

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

Опять же, смотрите документацию для Net :: HTTP # start . Используя блок, он открыл TCP-соединение и HTTP-сессию, которые автоматически закрываются после выполнения блока.

(3) Как использовать версию Пола Дикса, как я могу прочитать значения @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) Где я должен поместить свой сертификат .pem в моем приложении Ruby on Rails?

Я полагаю, что это характерно для сервера, который вы используете для обслуживания вашего приложения Rails, а не для самого приложения Rails.

(6) Что это значит?

Полагаю, это просто означает, что HTTP-сессия была закрыта. Смотрите # 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...