Как я могу передать опции SSL на "сервер рельсов" в Rails 3.0?

Есть ли способ передать опции SSL в "сервер rails" (на Rails 3.0.0), используя пользовательскую конфигурацию Rack или что-то подобное? Я пытаюсь сделать две вещи:

  1. разрешить Cucumber запускать тесты, включающие как безопасные, так и незащищенные URL, и
  2. упростите задачу для новых разработчиков, чтобы им не пришлось настраивать Apache и настраивать все компоненты SSL/cert, прежде чем они смогут даже написать строку кода.

На 2.3.8 у нас был разветвленный скрипт / сервер, который запускал специальный WEBrick на второй порт со всеми соответствующими параметрами SSL. Конечно, это взорвалось, когда я попытался обновить до Rails 3, поэтому я пытаюсь выяснить, как это исправить, и в идеале сделать это так, чтобы ничего не было разветвлено.

В нашем разветвленном скрипте / сервере мы настраивали параметры, подобные следующим:

:SSLEnable        => true,
:SSLVerifyClient    => OpenSSL::SSL::VERIFY_NONE,
:SSLPrivateKey        => OpenSSL::PKey::RSA.new(File.open(current_dir + "/config/certs/server.key").read),
:SSLCertificate         => OpenSSL::X509::Certificate.new(File.open(current_dir + "/config/certs/server.crt").read),
:SSLCertName    => [ [ "CN", WEBrick::Utils::getservername ] ]

но я не знаю, как это сделать в новых рамках.

Спасибо за любую помощь!

2 ответа

Взгляните на Тонкий сервер вместо WEBrick. Использование Thin имеет так много преимуществ, что я не могу перечислить их все здесь, но это должно решить вашу проблему, так как он поддерживает SSL.

При запуске thin, передайте следующие параметры:

SSL options:
    --ssl                        Enables SSL
    --ssl-key-file PATH          Path to private key
    --ssl-cert-file PATH         Path to certificate
    --ssl-verify                 Enables SSL certificate verification

В производственной среде вы в идеале захотите обрабатывать SSL на уровне Nginx или Apache, но это должно соответствовать вашим требованиям разработки.

Вот решение, которое я придумал. Я модифицировал script/rails выглядеть так:

#!/usr/bin/env ruby
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.

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

# Hack our SSL certs into Thin TcpServer, only in development environment
require 'thin'
module Thin
  module Backends
    TcpServer.class_eval do
      def initialize_with_SSL(host, port)
        if Rails.env.development?
          Rails.logger.info "Loading SSL certs from ./ssl_dev..."
          @ssl = true
          @ssl_options = {
            :private_key_file => File.expand_path("../../ssl_dev/server.key", __FILE__),
            :cert_chain_file  => File.expand_path("../../ssl_dev/server.crt", __FILE__),
            :verify_peer => nil
          }
        end

        initialize_without_SSL(host, port)
      end

      alias_method :initialize_without_SSL, :initialize
      alias_method :initialize, :initialize_with_SSL      
    end
  end
end

# Must load 'rails/commands' after Thin SSL hack
require 'rails/commands'
Другие вопросы по тегам