2010-03-02 14 views
11

Sinatra'da hızlı bir sunucu uygulaması yazmak istiyorum. Kendi kendine yeterli olmalı (yani apache/nginx/yolcuyu kullanmamalı), aynı zamanda SSL'yi de desteklemesi gerekiyor.Bağımsız bir Sinatra uygulaması için SSL nasıl etkinleştirilir?

Sinatra için SSL desteğini etkinleştirmenin kolay bir yolu var mı (örneğin WEBRick kullanarak)? dalgakıran-rackup taş

cevap

9

MRG yakutla bunu yapmak için aşağıdaki monkeypatch kullanın:

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 

Ardından, bağımsız bir uygulama içinde:

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

'add "WEBrick/https gerektiren emin olun "' sinatra_ssl.rb için gerekli gem listesine de. Aksi takdirde iyi çalışıyor! – sybohy

+0

İyi yakalama, sabit. – Jacob

2

Kullanım JRuby tercüman + dalgakıran-rackup mücevher (http://github.com/geekq/jetty-rackup) Düzenleme dalgakıran-rackup dosyası ve size yardımcı olacak bazı kod SslSocketConnector ekleyin:

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) 

Numune yapılandırma:

# 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 

oluşturuluyor keystore.jks: http://docs.codehaus.org/display/JETTY/How+to+configure+SSL

İlgili konular