ti-enxame.com

Como você configura o WEBrick para usar SSL no Rails?

Antes de Rails 3, você poderia modificar o arquivo de script/servidor para adicionar parâmetros SSL e dizer ao comando do servidor para usar a versão HTTPS do WEBrick. Agora que todos esses scripts se foram, alguém sabe como fazer isso funcionar Rails 3 ou 4?

31
Chris

Enquanto o diretório scripts em Rails 4 se foi, o diretório bin permanece. Você pode fazer o WEBrick trabalhar com um certificado SSL editando o código bin/Rails script Testado em Rails 4 e Ruby 2.1.1, instalado com rbenv.

Muito disso é de esta postagem no blog e essa pergunta sobre estouro de pilha .

#!/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'

Iniciar o servidor Rails no diretório do aplicativo funciona agora para iniciar um servidor habilitado para SSL quando a variável de ambiente SSL estiver definida como verdadeira e as configurações padrão Rails são retida quando a variável de ambiente é omitida.

$ 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:
...

Se você não quiser usar um certificado pré-gerado, poderá usar o Utils::create_self_signed_cert do WEBrick, conforme descrito nesta resposta:

Configure o WEBrick para usar o certificado SSL/HTTPS autoassinado gerado automaticamente

27
JustinParker

Uma alternativa ao SSL/HTTPS no WEBrick: SSL/HTTPS no Thin

Como alternativa à tentativa de configurar o WEBrick para usar HTTPS/SSL para o seu aplicativo Rails, você pode tentar usar o servidor Thin em vez disso, porque ele vem com opções convenientes para configurar HTTPS/SSL pronto para uso.

Instalando o Thin

Primeiro, adicione Thin como uma jóia ao seu Gemfile:

gem 'thin'

Então corra bundle install na linha de comando.

Usando Thin HTTPS/SSL para ambientes de desenvolvimento

Se você deseja apenas testar seu aplicativo Rails usando HTTPS/SSL no seu ambiente de desenvolvimento local, então você simplesmente executa

thin start --ssl

Devo enfatizar que isso não é adequado para ambientes de produção, porque você precisa usar um certificado SSL válido de uma Autoridade de Certificação para que as conexões SSL/HTTPS sejam verificáveis ​​e seguras.

Opções adicionais

Também há outras opções que você pode passar para o Thin. Você pode obter uma lista completa deles executando thin --help. Por exemplo, eu gosto de especificar meu próprio endereço IP e porta, além de daemonizar o Thin em um processo em segundo plano:

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

Usando Thin HTTPS/SSL com um certificado SSL

Se você deseja dizer ao Thin para usar um certificado SSL (por exemplo, um que você obteve de uma Autoridade de Certificação válida), poderá usar estas opções:

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