2012-07-10 11 views
7

Estoy buscando una forma sencilla de habilitar SSL en una aplicación independiente de Sinatra que se ejecuta mediante Thin sin tener que pasar los parámetros --ssl, --ssl-key-file y --ssl-cert-file en la línea de comando Thin.¿Puedo habilitar SSL en Sinatra con Thin?

¿Es posible definirlos directamente en la aplicación Sinatra o a través de un archivo config.ru?

He pasado varias horas buscando una respuesta a esta pregunta, pero hasta ahora no he encontrado nada que funcione.

+0

¿qué le parece escribir la línea de comando en un archivo de script? – lidaobing

Respuesta

10

Acabo de pasar unas horas tratando de resolver esto yo mismo.

Resulta que Thin::Server.initialize descartes ssl Opciones durante su método initialization (delega en su instancia de Backend, que establece de inmediato su ssl a nil, haciendo caso omiso de cualquier opción de SSL que ha pasado a Thin::Server.new. Esto significa que tienes que a establecer las opciones. ssl después de que haya creado una instancia de un servidor)

he aquí cómo hacerlo:

class App < Sinatra::Base 

    # ... 

    def self.run! 
    rack_handler_config = {} 

    ssl_options = { 
     :private_key_file => '/path/to/foo.key', 
     :cert_chain_file => '/path/to/bar.crt', 
     :verify_peer => false, 
    } 

    Rack::Handler::Thin.run(self, rack_handler_config) do |server| 
     server.ssl = true 
     server.ssl_options = ssl_options 
    end 
    end 
end 

App.run! 
+0

un ejemplo realmente útil :-) gracias – rtacconi

9

T Estos días (sinatra 1.4.1) run! acepta un bloque que produce servidor. Así que usted puede hacer esto:

MyApp.run! do |server| 
    ssl_options = { 
    :cert_chain_file => '/path/to/bar.crt', 
    :private_key_file => '/path/to/foo.key', 
    :verify_peer => false 
    } 
    server.ssl = true 
    server.ssl_options = ssl_options 
end 
+1

¡Muy bueno! ¿Dónde están documentadas estas opciones? - Parece que no puedo encontrar nada más que tu publicación. – user1513388

+1

http://rdoc.info/github/eventmachine/eventmachine/EventMachine/Connection:start_tls es aparentemente lo que está sucediendo aquí. – Swizzlr

0

estoy corriendo Sinatra y fina (en Heroku) con SSL mediante el Rack::SslEnforcer, hacer esto:

if production? 
    require 'rack/ssl-enforcer' 
    use Rack::SslEnforcer 
end 

Ésta debe ser antes de habilitar: sesiones en su archivo.

Cuestiones relacionadas