我可以在Sinatra中使用Thin启用SSL吗?

时间:2012-07-10 00:38:21

标签: ssl sinatra thin

我正在寻找一种在通过Thin运行的独立Sinatra应用程序中启用SSL的简单方法,而无需通过--ssl--ssl-key-file--ssl-cert-file参数传递细命令行。

是否可以直接在Sinatra应用程序中或通过config.ru文件定义它们?

我花了几个小时寻找这个问题的答案,但到目前为止还没有发现任何有效的方法。

3 个答案:

答案 0 :(得分:11)

我花了几个小时试图自己解决这个问题。

事实证明,Thin::Server.initialize在其ssl方法中放弃了initialization个选项(它委托给Backend的实例,该实例会立即将其ssl设置为nil Thin::Server.new,忽略您传递给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! 的任何ssl选项。这意味着您必须在实例化服务器之后设置ssl选项。)

以下是如何操作:

{{1}}

答案 1 :(得分:9)

这些天(sinatra 1.4.1)run!接受一个产生服务器的块。所以你可以这样做:

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

答案 2 :(得分:1)

我使用Rack::SslEnforcer使用SSL运行Sinatra和Thin(在Heroku上),执行此操作:

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

这应该在您启用文件中的会话之前。