我正在寻找一种简单的方式,在不通过Thin命令行传递--ssl
、--ssl-key-file
和--ssl-cert-file
参数的情况下,使独立的Sinatra应用程序启用SSL。
是否可以直接在Sinatra应用程序中或通过config.ru文件定义它们?
我已经花费了几个小时寻找答案,但目前还没有找到任何有效的方法。
我刚花了几个小时试图自己解决这个问题。
事实证明,在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!
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
if production?
require 'rack/ssl-enforcer'
use Rack::SslEnforcer
end
在启用:sessions之前,您需要进行以下操作。