Can I enable SSL in Sinatra with Thin?

萝らか妹 提交于 2019-11-29 14:24:30

问题


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 and --ssl-cert-file parameters in via the Thin command line.

Is it possible to define them directly within the Sinatra app or via a config.ru file?

I've spent several hours looking for an answer to this question, but so far have not found anything that works.


回答1:


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!



回答2:


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



回答3:


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.



来源:https://stackoverflow.com/questions/11405161/can-i-enable-ssl-in-sinatra-with-thin

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!