2012-07-10 8 views
7

Poszukuję prostego sposobu na włączenie protokołu SSL w samodzielnej aplikacji Sinatra uruchamianej przez Thin bez konieczności przekazywania parametrów --ssl, i za pośrednictwem cienkiego wiersza poleceń.Czy mogę włączyć SSL w Sinatra z Thin?

Czy można je zdefiniować bezpośrednio w aplikacji Sinatra lub pliku config.ru?

Spędziłem kilka godzin szukając odpowiedzi na to pytanie, ale jak dotąd nie znalazłem niczego, co działa.

+0

Jak napisać wiersz polecenia w pliku skryptu? – lidaobing

Odpowiedz

10

Po prostu spędziłem kilka godzin próbując samemu to wymyślić.

Okazuje się, że Thin::Server.initialize odrzuty ssl opcje podczas jego metody initialization (IT delegaci na jego wystąpienie Backend, który natychmiast ustawia jego ssl do nil, ignorując wszelkie opcje ssl przeszedłeś do Thin::Server.new. Oznacza to, że trzeba się . Ustawianie opcji ssl po już instancja serwera)

Oto jak to zrobić:

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

bardzo pomocny przykład :-) dziękuję – rtacconi

9

T hese days (sinatra 1.4.1) run! akceptuje blok, który daje serwer. Więc można to zrobić:

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

Very Cool! Gdzie są udokumentowane te opcje? - Nie mogę znaleźć niczego poza twoją pocztą! – user1513388

+1

http://rdoc.info/github/eventmachine/eventmachine/EventMachine/Connection:start_tls to najwyraźniej to, co się tutaj dzieje. – Swizzlr

0

biegnę Sinatrę i cienka (na Heroku) z SSL za pomocą Rack::SslEnforcer, robiąc w ten sposób:

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

To powinno być przed włączeniem: sesje w twojej plik.

Powiązane problemy