Как настроить WEBrick для использования SSL в Rails?

До Rails 3 вы могли изменить файл сценария/сервера, чтобы добавить параметры SSL и указать команде сервера использовать HTTPS-версию WEBrick. Теперь, когда все эти сценарии исчезли, кто-нибудь знает, как заставить это работать с Rails 3 или 4?


person Chris    schedule 04.09.2010    source источник
comment
Я нашел решение этой проблемы и задокументировал его здесь   -  person Chris    schedule 07.09.2010
comment
не могли бы вы предоставить ссылку на изменение файла скрипта/сервера для https в rails 2?   -  person ScotterC    schedule 19.01.2011
comment
Это должно помочь для Rails 2: lists.rubyonrails.org/pipermail/rails /2006-Январь/012432.html   -  person Chris    schedule 24.03.2011
comment
Не забудьте изменить URL-адрес и вручную добавить https://, иначе вы получите странную ошибку ERROR OpenSSL::SSL::SSLError: SSL_accept returned=1 errno=0 state=SSLv2/v3 read client hello A: http request   -  person Chloe    schedule 08.06.2013
comment
подробный ответ должен быть представлен / переписан как часть ответа. если другой сайт не работает, этот ответ становится бесполезным.   -  person Mathieu J.    schedule 11.07.2013
comment
К вашему сведению: с Rails 3.2.14 я получил: ПРЕДУПРЕЖДЕНИЕ: неразрешенные спецификации во время Gem::Specification.reset: rake (›= 0.8.7) ПРЕДУПРЕЖДЕНИЕ: очистка неразрешенных спецификаций... которые я исправил, переместив код, показанный в ссылке ссылка ниже «требуется File.expand.path ...» и выше окончательного «требуется» rails/commands.   -  person Jim Flood    schedule 21.01.2014
comment
Если кому-то интересно, оригинальный постер написал свое собственное решение в своем блоге, Настройка WEBrick для использования SSL в Rails 3. Однако мне интересно узнать, есть ли более простое решение.   -  person    schedule 18.04.2014
comment
Мне интересно, а зачем вам это?   -  person bbozo    schedule 18.04.2014


Ответы (2)


Хотя каталог scripts в Rails 4 исчез, каталог bin остался. Вы можете заставить WEBrick работать с SSL-сертификатом, отредактировав скрипт bin/rails. Протестировано на Rails 4 и Ruby 2.1.1, установленных с помощью rbenv.

Большая часть этого взята из этот пост в блоге и этот вопрос о переполнении стека.

#!/usr/bin/env ruby

require 'rails/commands/server'
require 'rack'
require 'webrick'
require 'webrick/https'

if ENV['SSL'] == "true"
  module Rails
      class Server < ::Rack::Server
          def default_options
              super.merge({
                  :Port => 3001,
                  :environment => (ENV['RAILS_ENV'] || "development").dup,
                  :daemonize => false,
                  :debugger => false,
                  :pid => File.expand_path("tmp/pids/server.pid"),
                  :config => File.expand_path("config.ru"),
                  :SSLEnable => true,
                  :SSLVerifyClient => OpenSSL::SSL::VERIFY_NONE,
                  :SSLPrivateKey => OpenSSL::PKey::RSA.new(
                                   File.open("certs/server.key").read),
                  :SSLCertificate => OpenSSL::X509::Certificate.new(
                                   File.open("certs/server.crt").read),
                  :SSLCertName => [["CN", WEBrick::Utils::getservername]],
              })
          end
      end
  end
end

APP_PATH = File.expand_path('../../config/application',  __FILE__)
require_relative '../config/boot'
require 'rails/commands'

Запуск сервера rails из каталога приложения работает для запуска сервера с поддержкой SSL сейчас, когда для переменной среды SSL установлено значение true, а настройки rails по умолчанию сохраняются, когда переменная среды опущена.

$ SSL=true rails s
=> Booting WEBrick
=> Rails 4.1.0 application starting in development on https://0.0.0.0:3001
=> Run `rails server -h` for more startup options
=> Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0.0.1 (--binding option)
=> Ctrl-C to shutdown server
[2014-04-24 22:59:10] INFO  WEBrick 1.3.1
[2014-04-24 22:59:10] INFO  ruby 2.1.1 (2014-02-24) [x86_64-darwin13.0]
[2014-04-24 22:59:10] INFO  
Certificate:
    Data:
...

Если вы не хотите использовать предварительно сгенерированный сертификат, вы можете использовать Utils::create_self_signed_cert WEBrick, как указано в этом ответе:

Настройте WEBrick для использования автоматически сгенерированного самозаверяющего SSL /HTTPS-сертификат

person JustinParker    schedule 25.04.2014
comment
Это создает проблему, сайт не работает по http и даже не перенаправляет на https. Я включил ssl.enforce= true, но это не сработало - person Dinesh Saini; 21.12.2014

Альтернатива SSL/HTTPS на WEBrick: SSL/HTTPS на тонком

В качестве альтернативы попытке настроить WEBrick для использования HTTPS/SSL для вашего приложения Rails вы можете попробовать переключиться на использование Тонкий сервер вместо этого, потому что он поставляется с удобными опциями для настройки HTTPS/SSL из коробки.

Установка тонкого

Во-первых, добавьте Thin как гем в свой Gemfile:

gem 'thin'

Затем запустите bundle install из командной строки.

Использование тонкого HTTPS/SSL для сред разработки

Если вы просто хотите протестировать приложение Rails с использованием HTTPS/SSL в локальной среде разработки, просто запустите

thin start --ssl

Я должен подчеркнуть, что это не подходит для производственных сред, потому что вам необходимо использовать действительный сертификат SSL от центра сертификации, чтобы можно было проверить соединения SSL/HTTPS. и безопасно.

Дополнительные опции

Есть и другие варианты, которые вы можете передать в Thin. Вы можете получить их полный список, запустив thin --help. Например, мне нравится указывать свой собственный ip-адрес и порт, а также демонизировать Thin в фоновый процесс:

thin start --ssl \
  --address <ip-address> \
  --port <port> \
  --daemonize

Использование тонкого HTTPS/SSL с сертификатом SSL

Если вы хотите указать Thin использовать SSL-сертификат (например, тот, который вы получили от действительного центра сертификации), вы можете использовать следующие параметры:

thin start --ssl \
  --ssl-cert-file <path-to-public-certificate> \
  --ssl-key-file <path-to-private-key>
person Community    schedule 17.04.2014
comment
С тонким, если у вас есть промежуточный сертификат (ы), поместите его в тот же файл, что и общедоступный сертификат, после сертификата конечного объекта. - person mcr; 24.05.2019