2010-03-02 62 views
11

我想在Sinatra寫一個快速的服務器應用程序。它必須是獨立的(即不使用apache/nginx/passenger),但也必須支持SSL。如何爲獨立的Sinatra應用程序啓用SSL?

有沒有簡單的方法來啓用對Sinatra的SSL支持(例如使用WEBRick)?

回答

9

要與MRI紅寶石做到這一點,請使用以下猴補丁:

sinatra_ssl.rb

require 'webrick/https' 

module Sinatra 
    class Application 
    def self.run! 
     certificate_content = File.open(ssl_certificate).read 
     key_content = File.open(ssl_key).read 

     server_options = { 
     :Host => bind, 
     :Port => port, 
     :SSLEnable => true, 
     :SSLCertificate => OpenSSL::X509::Certificate.new(certificate_content), 
     :SSLPrivateKey => OpenSSL::PKey::RSA.new(key_content) 
     } 

     Rack::Handler::WEBrick.run self, server_options do |server| 
     [:INT, :TERM].each { |sig| trap(sig) { server.stop } } 
     server.threaded = settings.threaded if server.respond_to? :threaded= 
     set :running, true 
     end 
    end 
    end 
end 

然後,在獨立應用程序:

app.rb

require 'sinatra' 
require 'sinatra_ssl' 

set :port, 8443 
set :ssl_certificate, "server.crt" 
set :ssl_key, "server.key" 

get "/" do 
    "Hello world!" 
end 
+1

請務必添加'需要「的WEBrick/HTTPS 「以及sinatra_ssl.rb所需的gem列表。否則工作正常! – sybohy 2013-07-24 22:00:38

+0

好抓,固定。 – Jacob 2014-06-05 20:27:43

2

使用JRuby解釋+碼頭-rackup寶石(http://github.com/geekq/jetty-rackup) 編輯碼頭,rackup在碼頭,rackup寶石文件,並添加SslSocketConnector,一些代碼,以幫助您:

security_connector = Jetty::Security::SslSocketConnector.new 
    security_connector.set_acceptors(config[:acceptor_size]) 
    security_connector.port = config[:port] 
    security_connector.confidential_port = config[:port] 
    security_connector.keystore = keystore 
    security_connector.password = config[:password] 
    security_connector.key_password = config[:key_password].nil? ? config[:password] : config[:key_password] 
    security_connector.truststore = truststore 
    security_connector.trust_password = config[:trust_pasword].nil? ? config[:password] : config[:trust_pasword] 
    server.add_connector(security_connector) 

樣本配置:

# Config 
:acceptor_size: 10 
:ssl: true 
:keystore: keystore.jks 
:password: your_pass 
# :key_password: your_pass # if different 
# :truststore: truststore.jks # if different 
# :trust_pasword: your_pass # if different 

生成keystore.jks:http://docs.codehaus.org/display/JETTY/How+to+configure+SSL

相關問題