【问题标题】:Can I enable SSL in Sinatra with Thin?我可以在 Sinatra 中使用 Thin 启用 SSL 吗?
【发布时间】:2012-07-09 10:45:29
【问题描述】:

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

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

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

【问题讨论】:

  • 把命令行写成脚本文件怎么样?

标签: ssl sinatra thin


【解决方案1】:

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

事实证明,Thin::Server.initialize 在其 initialization 方法期间丢弃了 ssl 选项(它委托给其 Backend 实例,该实例立即将其 ssl 设置为 nil,忽略您的任何 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!

【讨论】:

    【解决方案2】:

    这些天(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
    

    【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-10-01
      • 2012-01-27
      • 2012-02-18
      • 2015-07-23
      • 1970-01-01
      • 2011-07-01
      • 2016-12-31
      • 2012-07-23
      • 2014-06-23
      相关资源
      最近更新 更多