【问题标题】:How to enable SSL for a standalone Sinatra app?如何为独立的 Sinatra 应用启用 SSL?
【发布时间】:2010-03-02 09:42:27
【问题描述】:

我想在 Sinatra 中编写一个快速的服务器应用程序。它必须是独立的(即不使用 apache/nginx/passenger),但也必须支持 SSL。

是否有一种简单的方法可以为 Sinatra 启用 SSL 支持(例如使用 WEBRick)?

【问题讨论】:

    标签: ruby ssl sinatra webrick


    【解决方案1】:

    要使用 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
    

    【讨论】:

    • 请确保将require "webrick/https" 也添加到 sinatra_ssl.rb 所需的 gem 列表中。否则工作正常!
    【解决方案2】:

    使用 JRuby 解释器 + jetty-rackup gem (http://github.com/geekq/jetty-rackup) 在 jetty-rackup gem 中编辑 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-10
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多