我正在寻找一种简单的方法来在通过 Thin 运行的独立 Sinatra 应用程序中启用 SSL,而无需通过 Thin 命令行传递--ssl
,--ssl-key-file
和--ssl-cert-file
参数。
是否可以直接在 Sinatra 应用程序中或通过 config.ru 文件定义它们?
我花了几个小时寻找这个问题的答案,但到目前为止还没有找到任何有效的方法。
我只是花了几个小时试图自己解决这个问题。
事实证明,它在其方法期间Thin::Server.initialize
丢弃了ssl
选项initialization
(它委托给它的实例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!
这些天(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
我正在使用Rack::SslEnforcer使用 SSL 运行 Sinatra 和 Thin(在 Heroku 上) ,这样做:
if production?
require 'rack/ssl-enforcer'
use Rack::SslEnforcer
end
这应该在您在文件中启用 :sessions 之前。