我可以帮助您翻译成中文:Sinatra是否可以使用Thin启用SSL?

8

我正在寻找一种简单的方式,在不通过Thin命令行传递--ssl--ssl-key-file--ssl-cert-file参数的情况下,使独立的Sinatra应用程序启用SSL。

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

我已经花费了几个小时寻找答案,但目前还没有找到任何有效的方法。


在脚本文件中编写命令行怎么样? - lidaobing
3个回答

10

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

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

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

1
非常酷!这些选项在哪里有文档记录?我似乎除了你的帖子找不到其他东西! - user1513388
1
http://rdoc.info/github/eventmachine/eventmachine/EventMachine/Connection:start_tls 显然是这里正在发生的事情。 - Swizzlr

1
我正在使用Rack::SslEnforcer在Heroku上运行Sinatra和Thin,并启用SSL,具体操作如下:

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

在启用:sessions之前,您需要进行以下操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接