我正在寻找一种在通过Thin运行的独立Sinatra应用程序中启用SSL的简单方法,而无需通过--ssl
,--ssl-key-file
和--ssl-cert-file
参数传递细命令行。
是否可以直接在Sinatra应用程序中或通过config.ru文件定义它们?
我花了几个小时寻找这个问题的答案,但到目前为止还没有发现任何有效的方法。
答案 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
这应该在您启用文件中的会话之前。