Как я могу передать параметры SSL на сервер rails в Rails 3.0?

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

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

В версии 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 ] ]

но я не знаю, как это сделать в новой структуре.

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


person estoner    schedule 30.08.2010    source источник


Ответы (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, но это должно соответствовать вашим требованиям к разработке.

person phlipper    schedule 22.10.2011

Вот решение, которое я придумал. Я изменил 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'
person ndbroadbent    schedule 26.07.2012