Can I enable SSL in Sinatra with Thin?

后端 未结 3 2054
情话喂你
情话喂你 2021-01-02 13:57

I\'m looking for a simple way to enable SSL in a standalone Sinatra application running via Thin without having to pass the --ssl, --ssl-key-file a

相关标签:
3条回答
  • 2021-01-02 14:13

    I'm running Sinatra and Thin (on Heroku) with SSL using the Rack::SslEnforcer, doing this:

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

    This should be before you enable :sessions in your file.

    0 讨论(0)
  • 2021-01-02 14:19

    These days (sinatra 1.4.1) run! accepts a block that yields server. So you can do this:

    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
    
    0 讨论(0)
  • 2021-01-02 14:22

    I just spent a few hours trying to figure this one out myself.

    It turns out that Thin::Server.initialize discards ssl options during its initialization method (it delegates to its instance of Backend, which immediately sets its ssl to nil, ignoring any ssl options you've passed into Thin::Server.new. This means you have to to set ssl options after you've instantiated a server.)

    Here's how to do it:

    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 讨论(0)
提交回复
热议问题