8

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

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

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

4

3 回答 3

10

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

事实证明,它在其方法期间Thin::Server.initialize丢弃了ssl选项initialization(它委托给它的实例Backend,该实例立即将其设置sslnil,忽略您传递给的任何 ssl 选项。这意味着您必须在实例化服务器Thin::Server.new设置 ssl 选项。 )

这是如何做到的:

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!
于 2012-11-17T01:48:06.113 回答
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
于 2013-03-19T22:12:48.240 回答
1

我正在使用Rack::SslEnforcer使用 SSL 运行 Sinatra 和 Thin(在 Heroku 上) ,这样做:

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

这应该在您在文件中启用 :sessions 之前。

于 2015-03-21T07:52:08.390 回答