2010-03-02 32 views
11

Tôi muốn viết một ứng dụng máy chủ nhanh ở Sinatra. Nó phải được khép kín (tức là không sử dụng apache/nginx/hành khách) mà còn phải hỗ trợ SSL.Cách bật SSL cho ứng dụng Sinatra độc lập?

Có cách nào dễ dàng để bật hỗ trợ SSL cho Sinatra (sử dụng WEBRick chẳng hạn) không?

Trả lời

9

Để làm điều này với MRI ruby, sử dụng monkeypatch sau:

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 

Sau đó, trong ứng dụng độc lập của bạn:

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

Hãy chắc chắn để thêm 'đòi hỏi "webrick/https "' cũng như danh sách đá quý cần thiết cho sinatra_ssl.rb. Hoạt động tốt nếu không! – sybohy

+0

Bắt tốt, cố định. – Jacob

2

Sử dụng JRuby thông dịch viên + cầu cảng-rackup đá quý (http://github.com/geekq/jetty-rackup) Chỉnh sửa tập tin cầu cảng-rackup trong đá quý cầu cảng-rackup và thêm một SslSocketConnector, một số mã để giúp bạn:

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) 

mẫu cấu hình:

# 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 Tạo: http://docs.codehaus.org/display/JETTY/How+to+configure+SSL

Các vấn đề liên quan