Как включить SSL для автономного приложения Sinatra?

Я хочу написать быстрое серверное приложение в Sinatra. Он должен быть автономным (т. е. не использовать apache/nginx/passenger), но также должен поддерживать SSL.

Есть ли простой способ включить поддержку SSL для Sinatra (например, с помощью WEBRick)?


person Jacob    schedule 02.03.2010    source источник


Ответы (2)


Чтобы сделать это с помощью MRI ruby, используйте следующий обезьяний патч:

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
person Jacob    schedule 21.01.2012
comment
Не забудьте также добавить require "webrick/https" в список необходимых драгоценных камней для sinatra_ssl.rb. В остальном работает нормально! - person sybohy; 25.07.2013

Используйте интерпретатор JRuby + гем jetty-rackup (http://github.com/geekq/jetty-rackup) Отредактируйте файл jetty-rackup в геме jetty-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

person clyfe    schedule 03.03.2010