Как вы настраиваете WEBrick для использования SSL в Rails? - PullRequest
30 голосов
/ 04 сентября 2010

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

Ответы [ 2 ]

27 голосов
/ 25 апреля 2014

Пока каталог 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:
...

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

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

20 голосов
/ 17 апреля 2014

Альтернатива SSL / HTTPS на WEBrick: SSL / HTTPS на Thin

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

Установка Thin

Сначала добавьте Thin в качестве драгоценного камняв ваш Gemfile:

gem 'thin'

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

Использование Thin 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

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

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

thin start --ssl \
  --ssl-cert-file <path-to-public-certificate> \
  --ssl-key-file <path-to-private-key>
...