我在寻找一个简单的方法,以使在通过薄运行的独立应用程序西纳特拉SSL,而不必通过--ssl
, --ssl-key-file
和--ssl-cert-file
通过薄的命令行参数中。
是否有可能直接在西纳特拉应用程序内或通过config.ru文件来定义呢?
我花了几个小时寻找一个回答这个问题,但到目前为止还没有找到任何工作。
我在寻找一个简单的方法,以使在通过薄运行的独立应用程序西纳特拉SSL,而不必通过--ssl
, --ssl-key-file
和--ssl-cert-file
通过薄的命令行参数中。
是否有可能直接在西纳特拉应用程序内或通过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!
这些天来(西纳特拉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
我使用的是与SSL运行西纳特拉和薄(在Heroku) 机架:: SslEnforcer ,这样做:
if production?
require 'rack/ssl-enforcer'
use Rack::SslEnforcer
end
这应该是您启用前:在您的文件会话。