Как я могу передать опции SSL на "сервер рельсов" в Rails 3.0?
Есть ли способ передать опции SSL в "сервер rails" (на Rails 3.0.0), используя пользовательскую конфигурацию Rack или что-то подобное? Я пытаюсь сделать две вещи:
- разрешить Cucumber запускать тесты, включающие как безопасные, так и незащищенные URL, и
- упростите задачу для новых разработчиков, чтобы им не пришлось настраивать 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'