Fino com suporte a SSL e debugging de ruby

Alguém sabe de uma maneira de executar o depurador ruby ​​e SSL ao mesmo tempo com Thin?

Eu tenho usado o Thin com sucesso com o Rails 3.0.10.

Eu inicio usando rails server --debugger , e posso depurar meu código.

Recentemente, também precisei adicionar suporte SSL ao meu aplicativo, e gostaria de poder testá-lo localmente com um certificado autoassinado.

Infelizmente, não encontrei uma maneira de iniciar o Thin com suporte a SSL ao usar o rails server .

Eu posso iniciar com êxito Thin com suporte a SSL usando:

 thin start --ssl --ssl-verify --ssl-key-file ssllocal/server.key --ssl-cert-file ssllocal/server.crt 

No entanto, não encontrei uma maneira de ativar o depurador usando o thin start .

Portanto, parece que tenho a opção de executar o depurador ( rails server ) ou SSL ( thin start ), mas não ambos.

Parece possível fazer o Webrick executar o SSL usando o rails server , modificando o arquivo rails / script ( veja aqui ). Eu experimentei essa abordagem, mas não tive sucesso. Aqui está uma das tentativas:

 #!/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__) # THIS IS NEW: require "rails/commands/server" require 'rack' require 'thin' module Rails class Server def default_options super.merge({ :Port => 3000, :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 :ssl => true, "ssl-verify" => true, "ssl-key-file" => File.expand_path("ssllocal/server.key"), "ssl-cert-file" => File.expand_path("ssllocal/server.crt") }) end end end require 'rails/commands' 

Nota: para aqueles que podem estar se perguntando, criei um diretório ‘ssllocal’ no meu diretório de aplicativos raiz, e é onde eu armazeno as chaves ssl e certs.

Você pode tentar apenas exigir o depurador em seu ambiente de desenvolvimento.

No seu Gemfile:

 if RUBY_VERSION =~ /^1.9/ gem "ruby-debug19", :group => :development else gem "ruby-debug", :group => :development end 

E dentro do bloco de configuração de seu config / environments / development.rb:

 require 'ruby-debug' Debugger.start 

Isso permite que você coloque a instrução do depurador em qualquer lugar no seu código.

Aqui está minha solução – eu hackeei o Thin TcpServer para carregar meus certificados SSL autoassinados, somente no ambiente de desenvolvimento. Meu script/rails parece com isso:

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

Eu era capaz de obter com sucesso a debugging trabalhando com SSL habilitado thin, usando a solução sugerida por nathan. Embora eu tivesse que fazer uma pequena alteração na adiação da boot do @ssl após a chamada de initialize_without_ssl (um método de alias para a boot do TcpServer original)

 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_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) # @ssl initialized after calling the original initialize of TcpServer @ssl = true if Rails.env.development? end alias_method :initialize_without_SSL, :initialize alias_method :initialize, :initialize_with_SSL end end end alias_method :initialize_without_SSL, :initialize alias_method :initialize, :initialize_with_SSL end 

No snippett de código acima, @ssl é definido como true depois de chamar a chamada de boot original de Thin :: Backend :: TcpServer. Eu tive que fazer isso desde que o TcpServer invoca a boot de seus pais (Thin :: Backend: Base) que define o @ssl para nil

  #Base initialize method. Thin gem version 1.5.0 def initialize @connections = [] @timeout = Server::DEFAULT_TIMEOUT @persistent_connection_count = 0 @maximum_connections = Server::DEFAULT_MAXIMUM_CONNECTIONS @maximum_persistent_connections = Server::DEFAULT_MAXIMUM_PERSISTENT_CONNECTIONS @no_epoll = false @ssl = nil @threaded = nil end 

Como observado no bloco de códigos do nathan, toda a solução parece ser um truque por aí. Na minha opinião, estou bem com o snippet, considerando que o código é feito dentro do contexto do env.development e, mais importante, ele permite a debugging com o ssl ativado.

Aqui está como eu consegui finalmente trabalhar na produção usando Thin:

 rvmsudo thin start -p 443 --ssl --ssl-key-file ssl/server.key --ssl-cert-file ssl/server.crt 

Se você está tendo problemas com o seu arquivo KEY, certifique-se de validar o CSR usando um site como:

 https://ssl-tools.verisign.com 

Se o seu CSR falhar, o certificado recebido da sua autoridade de assinatura também falhará. Meu site se recusaria a carregar com os certificados SSL, apenas para descobrir que eu abreviei meu nome de estado para “TX” em vez de “Texas” ao criar minha chave privada. Essa foi a razão pela qual não estava funcionando o tempo todo! Certificados SSL são uma dor na bunda!

    Intereting Posts